Vue 自定义单选组件

先展示样式效果



代码如下

html:循环遍历数组展示单选内容,点击后绑定picked值会与value值相等,

若v-model值和:value值相等就会触发checked=true

<div v-for="(i,index) of dd" :key="index">
  <label class="myRadio">
    <input type = "radio" v-model="picked" :value="i"/>
    <span>{{i}}</span>
  </label>
</div>

<p>选择的项是:{{picked}}</p>

script:

data () {
  return {
    picked: 'js',
    dd: ['html', 'js', 'css']
  }
},
watch: {
  picked () {
    console.log('changed')
  }
},

css样式 

隐藏原radio,并添加兄弟节点span,重写input的响应样式会直观作用到span

.test {
  height: 100%;
  background: #F3F7F8;
  padding-top: 1rem;
  .myRadio {
    width: 80%;
    margin-left: 10%;
    margin-bottom: 0.2rem;
    display: block;
    cursor: pointer;
  }
  .myRadio input[type="radio"] {
    outline: none;
    display: none
  }
  .myRadio input[type="radio"] + span{
    color: black;
    display: block;
    width: 100%;
    height: 0.7rem;
    background: #FFFFFF;
    border-radius: 0.103rem;
    box-shadow: 3px 5px 4px 0 rgba(189,188,188,0.36);
    font-size: 0.35rem;
    line-height: 0.7rem;
    text-indent: 0.2rem;
  }
  .myRadio input[type="radio"]:checked + span {
    background-color: #55CCFE;
    color: white;
  }

  p{
    font-size: 0.2rem;
  }
### Vue.js 单选树形结构组件Vue.js 中实现单选树形结构可以通过自定义组件来完成,也可以利用现有的库。对于希望快速集成并具有稳定性的开发者来说,使用成熟的第三方库通常是更好的选择。 #### 使用 Element Plus 的 Tree 组件 Element Plus 是一个广泛使用的 UI 库,提供了丰富的组件集,其中包括功能强大的 `Tree` 组件。该组件支持多种配置选项,可以轻松设置成单选模式[^1]: ```vue <template> <el-tree :data="treeData" @node-click="handleNodeClick"></el-tree> </template> <script setup> import { ref } from 'vue'; const treeData = [ { label: 'Level one 1', children: [{ label: 'Level two 1-1' }] }, { label: 'Level one 2', children: [{ label: 'Level two 2-1' }] } ]; function handleNodeClick(data) { console.log('Selected node:', data); } </script> ``` 通过上述代码片段中的 `@node-click` 事件监听器,可以在节点被点击时触发回调函数,并获取到当前选中的数据项。为了确保每次只允许选择一个节点,在处理逻辑内部应加入相应的控制机制。 #### 自定义实现方法 如果不希望通过引入大型UI框架的方式解决问题,则可以从零构建满足需求的单选树形控件。这涉及到创建递归渲染子节点的功能以及管理状态变化的能力。下面是一个简单的例子展示如何着手开发这样的组件: ```vue <template> <ul class="tree"> <li v-for="(item, index) in items" :key="index"> {{ item.label }} <!-- 如果存在children属性则继续遍历 --> <tree-node v-if="item.children && item.children.length" :items="item.children"/> </li> </ul> </template> <script setup> defineProps({ items: Array, }); </script> <style scoped> .tree ul li { list-style-type: none; } </style> ``` 此模板仅展示了基础层次结构;要添加交互性和单一选择行为,还需要进一步扩展 JavaScript 部分以跟踪已激活项目的状态,并相应更新视图。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值