vue+elementui 表单中实现级联选择,首层多选第二层单选

// 在表单中使用

<el-form-item label="级联">
  <el-cascader
    placeholder="请选择"
    @change="cascaderChange"
    :props="{
      checkStrictly: false,
      emitPath: false,
      multiple: true,
    }"
    :value="form.cascader"
    :options="options"
    clearable
    ref="cascaderRef"
  />
</el-form-item>

// 涉及到的方法
methods:{
  cascaderChange(value) {
    this.getValue(this.form.cascader, 'cascaderRef', 'form', value)
  },
  getValue (initVal, refName, editRuleForm, value) {
    var nodes = this.$refs[refName].getCheckedNodes();
    if (nodes.length == 0) {
      this[editRuleForm].cascader = [];
      return;
    }
    const editArray = []
    // 新增的值
    const newData = []
    const cancelData = []

    nodes.forEach(item => {
      const find = initVal.findIndex(id => id === item?.path[1] && item.checked) !== -1
      const findCancel = value.findIndex(id => id === item?.path[1] && item.checked) === -1
      if (findCancel || !item.checked) {
        cancelData.push({ ...item, checked: false })
      } else if (find) {
        // 已经选中的一级
        editArray.push({ parent: item?.path[0], child: item?.path[1] })
      } else if (item.checked) {
        // 已经选择的新的
        newData.push(item)
      }
    })
    const lastNode = newData[newData.length - 1]
    // 最后操作的节点,首级存在在已经在的值内
    if (editArray.findIndex(i => i.parent === lastNode?.path?.[0]) !== -1) {
      const newBranch = this[editRuleForm].cascader.filter(id => {
        return editArray.findIndex(i => i.child === id && lastNode?.path?.[0] === i.parent) === -1
      })
      newBranch.unshift(lastNode?.path?.[1])
      this[editRuleForm].cascader = newBranch
    } else {
      const newBranch = this[editRuleForm].cascader.filter(id => {
        return cancelData.findIndex(item => item.path[1] === id) === -1 && nodes.findIndex(item => item.path[1] === id) !== -1
      })
      if (lastNode?.path?.[1]) {
        newBranch.unshift(lastNode.path[1])
      }
      this[editRuleForm].cascader = newBranch
    }
  },
}

效果图

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Vue+ElementUI使用el-select组件进行单选多选时,可以通过设置v-model来绑定选的值,并且根据el-select组件的multiple属性来决定是单选还是多选单选时,v-model绑定的是一个普通变量,当用户选择一个选项时,v-model变量会被更新为选的值。例如: ``` <el-select v-model="selectedItem"> <el-option label="选项1" value="option1"></el-option> <el-option label="选项2" value="option2"></el-option> <el-option label="选项3" value="option3"></el-option> <el-option label="选项4" value="option4"></el-option> </el-select> ``` 其,`selectedItem`是一个普通变量,用来保存选的值。当用户选择一个选项时,`selectedItem`变量会自动更新。 多选时,v-model绑定的是一个数组,用来保存选的值。例如: ``` <el-select v-model="selectedItems" multiple> <el-option label="选项1" value="option1"></el-option> <el-option label="选项2" value="option2"></el-option> <el-option label="选项3" value="option3"></el-option> <el-option label="选项4" value="option4"></el-option> </el-select> ``` 其,`selectedItems`是一个数组,用来保存选的值。当用户选择一个或多个选项时,`selectedItems`数组会自动更新。 要回显已选的值,只需要将v-model绑定的变量或数组初始化为已选的值即可。例如: 单选回显: ``` <template> <el-select v-model="selectedItem"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option> </el-select> </template> <script> export default { data() { return { selectedItem: "option2", // 已选的值 options: [ { label: "选项1", value: "option1" }, { label: "选项2", value: "option2" }, { label: "选项3", value: "option3" }, { label: "选项4", value: "option4" }, ], }; }, }; </script> ``` 多选回显: ``` <template> <el-select v-model="selectedItems" multiple> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option> </el-select> </template> <script> export default { data() { return { selectedItems: ["option2", "option4"], // 已选的值 options: [ { label: "选项1", value: "option1" }, { label: "选项2", value: "option2" }, { label: "选项3", value: "option3" }, { label: "选项4", value: "option4" }, ], }; }, }; </script> ``` 在上面的例子,`selectedItem`变量或`selectedItems`数组被初始化为已选的值,因此在页面加载时,已选的选项会被自动回显。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值