父组件子组件值传递遇到的问题

封装的下拉框不显示id对应的label
点击编辑,修改页面获取到id值,并且与下拉框对应的id值相同

<el-form-item label="适用烟:" style="width:300px;">
        <tree-select
          v-model="comboSchemeOrder.tobaccoTypeId"
          :checkOnClickNode="false"
          :options="brandList"
          width="150"
        />
 </el-form-item>
created() {
   
    pubApi.brandListTree().then(res => {
   
        this.brandList = res.data;
      });
  },

于是查看是否是封装的treeSelect问题
分别在父组件打印brandlist,在子组件的created中打印接收的options

输出的顺序是optionsbrandlist,并且options为空。

所以要在获取options值之后再执行查找id对应label操作,即

子组件监听数据渲染完后执行某函数、watch监听prop中的属性有值后再执行、prop中属性值不为空

nextTick:在下次 DOM 更新循环结束之后执行延迟回调

watch:用于观察Vue实例上的数据变动。对应一个对象,键是观察表达式,值是对应回调。

子组件修改如下

 watch: {
    options() {
      // 子组件监听数据渲染完后执行
      this.setLabel();
    },
    methods: {
        setLabel() {
          this.$nextTick(()=>{
          // 检测输入框原有值并显示对应 label
          if (this.value) {
            this.valueModel = this.value;
            this.labelModel = this.queryTree(this.data, this.value);
          }
          })     
        },
    }

树形下拉框组件完整代码如下:

<!--
  树形下拉选择插件,
  defaultExpandedKeys:默认展开的节点
  defaultExpandedLevel:默认展开层级
  defaultExpandedKeys更高
-->
<!--禁止搜索-->
<!--:readonly="!filterable"-->
<!-- 树状选择器 -->
<template>
  <el-dropdown trigger="click" class="tree-select" @visible-change="onVisibleChange">
    <el-input
      ref="input"
      v-model="labelModel"
      :placeholder="placeholder"
      :clearable="!filterable"
      :disabled="disabled"
      suffix-icon="el-icon-arrow-down"
      :class="{ 'rotate': showStatus }"
      :style="`width:${
      width || 200}px`"
      @input="onFilter"
      @clear="clear()"
      @blur="UpdateTaskName($event)"
    />
    <el-dropdown-menu slot="dropdown">
      <el-tree
        v-show="!disabled"
        ref="tree"
        :style="`min-width: ${
      treeWidth}; max-height:${
      treeHeight}`"
        :props="props"
        :node-key="props.key"
        :data="data"
        :show-checkbox="showCheckbox"
        :default-expanded-keys="expandedKeys"
        :default-checked-keys="checkedKeys"
        :filter-node-method="filterNode"
        @node-click="onClickNode"
        @check="onCheckChange"
        :check-on-click-node="checkOnClickNode"
        :expand-on-click-node="expandOnClickNode"
      ></el-tree>
    </el-dropdown-menu>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,当组件传递给子组件的值改变时,组件展示的变化可以通过以下几种方式实现。 第一种方式是在组件中定义一个watch属性,用来监听组件通过prop传递的数据的变化情况。当组件的值改变时,watch属性会自动触发相应的回调函数,你可以在回调函数中更新组件的展示。\[2\] 第二种方式是在组件中使用ref来声明组件,并通过this.$refs来访问组件的方法。当组件的值改变时,可以调用组件中的方法来重新渲染组件。需要注意的是,在调用组件方法之前,最好使用Vue.nextTick()来确保DOM已经更新完毕。\[3\] 另外,如果组件传递给子组件的值是通过axios异步请求获取的,可能会出现组件获取数据为空的问题。解决这个问题的思路有两种:一种是等组件确认从后端获取到数据之后再传递给子组件;另一种是在组件中监听组件传递数据的变化情况,当数据到达后再进行展示。\[2\] 综上所述,你可以根据具体情况选择合适的方式来实现组件传递给子组件的值改变时组件展示的变化。 #### 引用[.reference_title] - *1* *2* [Vue 组件通过 prop 传值给子组件组件获取的值为空-解决记录](https://blog.csdn.net/qq_41773806/article/details/121735767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [vue组件传值给子组件组件值改变,组件重新渲染](https://blog.csdn.net/hukay22/article/details/123913499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值