同时修改select选项与值时v-bind:value+v-on:change失效问题求助
搞定Vue下拉框同步异常的问题
嘿,我之前也踩过类似的坑,来帮你理清楚为啥用:value+@change代替v-model时,会出现第一次点击只有第一个下拉框生效的情况,以及怎么解决它!
问题根源在哪?
这其实和Vue的异步更新机制以及v-model的语法糖特性有关:
v-model不只是简单的绑定值加监听事件,它内部做了同步优化,能确保数据更新和视图渲染的节奏一致,不会出现错位。- 而当你手动用
:value+@change的时候,你同时修改了options数组和绑定的value,Vue会把DOM更新放到异步队列里。第一次点击时,第一个下拉框的选项先更新完,能匹配到新的value=3;但其他下拉框的选项还没更新,此时设置的value在旧选项里找不到对应项,自然没法同步。等第二次点击时,所有下拉框的选项都已经更新好了,就能正确匹配value了。
两种解决办法任你选
办法1:用$nextTick等DOM更完再设值
把设置value的操作放到$nextTick回调里,确保所有下拉框的选项都更新完毕后,再设置value:
methods: { change() { this.options = [ { text: 'Three', value: 3 }, { text: 'Four', value: 4 } ]; this.$nextTick(() => { this.value = 3; }); } }
这样一来,当设置value的时候,所有<select>的选项都已经是新的了,一次点击就能让所有下拉框同步到3。
办法2:直接用v-model(最省心)
如果没有特殊的自定义事件逻辑,直接用v-model就完事了!它内部已经帮我们处理好了这些同步细节,根本不会出现这种延迟生效的问题,省得自己折腾。
调整后的效果
不管用哪种办法,点击"change"按钮后,所有下拉框的选项会立刻更新,同时value也会同步变成3,再也不用点第二次啦~
内容的提问来源于stack exchange,提问作者Gudradain
相关产品推荐
相关产品推荐

