在写代码时遇到一个小问题,代码模拟如下:
<div>
<el-radio-group v-model="value">
<el-radio-button label="1">张三</el-radio-button>
<el-radio-button label="2">李四</el-radio-button>
<el-radio-button label="3">王五</el-radio-button>
</el-radio-group>
<div>
<dictSelect v-if="1 == value" v-model="value2" :options="options1" @change="change1"></dictSelect>
<dictSelect v-if="2 == value" v-model="value2" :options="options2" @change="change3"></dictSelect>
</div>
</div>
</template>
<script>
export default {
data() {
return {
value: '',
value2: '',
dataKey: new Date().getTime(),
options1: [
{ key: '1', value: '编号:316165390658961408 暂无证件号' },
],
options2: []
}
},
}
</script>
dictSelect
是自己封装过的el-select
组件,里面有一个功能是如果options
有值,会自动选中第一个值并触发change
事件
问题如下:value
从张三切换到李四时,options2
为空,在组件中查看数据options
取到的值也是为空,但是组件会把options1
的值渲染出来,如下图所示:
这种问题好解决嘛,加个
key
就好了。我想dictSelect
组件一次只会加载一个,我就没必要在每个dictSelect
上都加key
了,直接在父元素上加一个key
好了,代码如下:
<div :key="dataKey">
<dictSelect v-if="1 == value" v-model="value2" :options="options1" @change="change1"></dictSelect>
<dictSelect v-if="2 == value" v-model="value2" :options="options2" @change="change3"></dictSelect>
</div>
以上代码,同时在value
值切换时更新key,但是这样会出现组件加载时选中第一个值会触发一次change
事件,key
更新时组件更新会再次触发change
事件,导致change
事件触发两次的问题
解决以上问题只需要,把key
加到每个组件上就ok了,并且key
不需要使用动态key
,只需要使用固定字符串就可以了
代码如下:
<div>
<dictSelect key="dictKey1" v-if="1 == value" v-model="value2" :options="options1" @change="change1"></dictSelect>
<dictSelect key="dictKey2" v-if="2 == value" v-model="value2" :options="options2" @change="change3"></dictSelect>
</div>