vue3 element-plus el-cascader 单选点击 只点击文字问题

本文介绍了在Vue3中使用Element-Plus的Cascader组件时,如何处理单选模式下仅点击文字触发选择的解决方案。通过CSS样式调整,确保点击文字能够正确响应。

`
vue3中element-plus 联级 单点问题

``
  <el-cascader
            placeholder="xxx"
            :options="options"
            v-model="shareScope"
            clearable
            collapse-tags
            :show-all-levels="false"
            size="small"
            ref="elcascader"
            :props="props"
            popper-class="cscaderS"
          >
            <template #default="{ data }">
              <!-- 这块必须是块级元素,顶满100%,否则过短的文字无法被点击到 -->
              <div @click="select(data)">
                {{ data.label }}
              </div>
            </template>
          </el-cascader>
import {
  reactive,
  toRefs,
  onMounted,
  computed,
  watch,
  markRaw,
  ref,
} from "vue";
 setup() {
    let router = useRouter();
    let store = useStore();
    let list = reactive({
   
      shareScope: [],
      props: {
        multiple: false,
        emitPath: false,
        //开启懒加载
        lazy: true,
        checkStrictly: true,
        lazyLoad: selDep,
      },
      countSum: 0,
      goValue: "",
      reIndex: "",
      shareScope: [], //值
      options: [
        // {
        //   value: "zhinan",
        //   label: "指南",
        // },
      ],
      key: 0,
    });
    function select(data) {
      list.shareScope = data.value;
    }
    function selDep(node, resolve) {
      let brand = null;
      if (node != undefined) {
        let { level } = node;
        if (node.value == undefined) {
          brand = "";
        } else {
          brand = node.value;
        }
        if (level < 2) {
          resolve();
        }
      } else {
        brand = "";
      }
      let time = new Date().getTime().toString();
      if (brand != "") {
        getDept({
          TIMESTAMP: time,
          VERIFICATION: md5(
            "" 
          ),
          EMPLID: "",
        }).then((res) => {
          if (res["ERROR_CODE"] == "20000") {
            // list.options = markRaw(res["EpEvalDeptInfo"]);
            let params = res["EpEvalDeptInfo"];
            params.forEach((item, index) => {
              if (item.children[0].label == "") {
                item.children = [];
              }
            });
            let result = null;
            result = params.map((item) => ({
              value: item.value,
              label: item.label,
              children: item.children,
            }));
            let options = result;

            let nodesChildren = null;
            options.forEach((item, index) => {
              // if ((item.children[0].label = "")) {
              //   item.children = [];
              // }
              let opt = item.children;
              if (opt != undefined) {
                nodesChildren = Array.from(opt).map((itemChild) => ({
                  value: itemChild.value,
                  label: itemChild.label,
                  children: itemChild.children,
                }));
              }
            });

            resolve(nodesChildren);
          }
        });
      }
    }

 

  
    // 获取父级数据
    function getDeptList(node, resolve) {
      console.log("key2:", list.key);

      let brand = null;
      if (node != undefined && node != null) {
        let { level } = node;
        brand = node[node.length - 1];
        if (level.length > 2) {
          resolve();
        }
      } else {
        brand = "";
      }
      let time = new Date().getTime().toString();
      getDept({
        TIMESTAMP: time,
        VERIFICATION: md5(
        
        ),
        EMPLID: "",
      
      }).then((res) => {
        if (res["ERROR_CODE"] == "20000") {
          list.options = markRaw(res["EpEvalDeptInfo"]);
          let params = res["EpEvalDeptInfo"];
          let result = null;
          result = params.map((item) => ({
            value: item.value,
            label: item.label,
            children: item.children,
          }));
          let options = result;
          let nodesChildren = null;
          options.forEach((item, index) => {
            let opt = item.children;
            if (opt != undefined) {
              nodesChildren = Array.from(opt).map((itemChild) => ({
                value: itemChild.value,
                label: itemChild.label,
                children: itemChild.children,
              }));
            }
          });

          // resolve(nodesChildren);
        }
      });
    }
  
 
     
  
  
      setTimeout(() => {
        if (FlowList.length > 0) {
          let time = new Date().getTime().toString();
          cheTxt({
            TIMESTAMP: time,
            VERIFICATION: md5(
          ""
            ),
            EMPLID: "",
       
            FlowList: FlowList,
          }).then((res) => {
            if (res["ERROR_CODE"] == "20000") {
              ElMessage({
                message: "提交成功",
                type: "success",
                offset: window.screen.height / 5,
              });
          
            } else {
              ElMessage({
                message: res["ERROR_MSG"],
                type: "error",
                offset: window.screen.height / 5,
                duration: 1000,
              });
            }
          });
        } else {
          ElMessage({
            message: "没有可提交项",
            type: "warning",
            offset: window.screen.height / 5,
          });
        }
      }, 100);
    }
  


 
  


    onMounted(() => {
      list.loading = false;
      list.key += 1;
      getDeptList();
    });

    return {
      ...toRefs(list),
      getDeptList,
      select,
    };
  },


css样式

.cscaderS .el-radio {
    display: none;
}
### 如何在 Element PlusEl-Cascader 组件中实现地区联级懒加载及回显功能 #### 实现懒加载的核心逻辑 El-Cascader 支持通过 `lazy` `lazyLoad` 属性来实现动态数据加载。当设置 `lazy=true` ,组件会在每次展开节点调用 `lazyLoad` 方法以异步加载节点的数据[^1]。 以下是完整的实现方式: --- #### 示例代码:地区联级懒加载及回显功能 ```javascript <template> <el-cascader v-model="selectedValue" :options="options" :props="props" clearable @change="handleChange" /> </template> <script> import { ref } from &#39;vue&#39;; export default { setup() { const selectedValue = ref([]); const options = []; // 配置 lazy 加载参数 const props = { lazy: true, lazyLoad(node, resolve) { setTimeout(() => { const result = []; if (node.level === 0) { // 第一层级(省份) result.push({ value: &#39;province1&#39;, label: &#39;Province One&#39; }); result.push({ value: &#39;province2&#39;, label: &#39;Province Two&#39; }); } else if (node.level === 1) { // 第二层级(城市),基于父节点的值生成 switch (node.value) { case &#39;province1&#39;: result.push({ value: &#39;city1_1&#39;, label: &#39;City One-One&#39; }); result.push({ value: &#39;city1_2&#39;, label: &#39;City One-Two&#39; }); break; case &#39;province2&#39;: result.push({ value: &#39;city2_1&#39;, label: &#39;City Two-One&#39; }); break; } } // 如果当前节点已经有 children,则不再重新加载 if (!node.loading && !node.children?.length) { resolve(result); } }, 1000); // 模拟网络请求延 }, }; // 处理 change 事件 const handleChange = (value) => { console.log(&#39;Selected Value:&#39;, value); }; return { selectedValue, options, props, handleChange, }; }, }; </script> ``` --- #### 关键点解析 1. **Lazy Load 参数配置** - 设置 `lazy: true` 启用懒加载模式。 - 使用 `lazyLoad` 函数定义如何加载节点数据。该函数接收两个参数:`node` 表示当前节点的信息;`resolve` 用于返回子节点数据[^1]。 2. **防止重复加载** 当前节点如果已经存在 `children` 或者正在加载状态 (`loading`),则不需要再次调用 `lazyLoad` 来加载数据[^3]。 3. **回显功能** 在编辑场景下,可以通过绑定 `v-model` 值并初始化为已有路径数组的方式完成回显。例如: ```javascript const selectedValue = ref([&#39;province1&#39;, &#39;city1_1&#39;]); ``` 4. **性能优化** 对于单选情况下的懒加载,可以减少不必要的 DOM 更新次数,从而提升回显效率[^2]。 --- #### 注意事项 - 确保每一层的数据结构一致,通常需要包含 `value`, `label` 字段。 - 如果涉及跨区域或多语言支持,需提前设计好接口返回的数据格式。 - 编辑页面中,建议先同步本地缓存数据后再渲染 Cascader,避免因网络延迟影响用户体验。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值