关于直接赋值对象导致响应式丢失

1.问题复现如下:

复制代码
 <el-select v-model="item.question_type" placeholder="请选择" @change="txChangeFn(index,item.question_type)">
                                        <el-option
                                            v-for="item in txList"
                                            :key="item.value"
                                            :label="item.label"
                                            :value="item.value">
                                        </el-option>
                                    </el-select>

//题型变更
        txChangeFn(index,params){
            this.wenjuan.wtlist[index].question_type=params
            if(this.wenjuan.wtlist[index].question_type=='dan'){
                this.wenjuan.wtlist[index]={
                    "question_text": "", //问题
                    "question_type": "dan", // 'dan'单选, 'duo'多选, 'text'文本
                    "required": "Y", // 是否必答
                    "xxlist": [
                            {
                                option_text: ""
                            },
                            {
                                option_text: ""
                            },
                            {
                                option_text: ""
                            },
                            {
                                option_text: ""
                            }
                    ] //选项list 对于文本题,此数组可以为空或省略
                }
            }else if(this.wenjuan.wtlist[index].question_type=='duo'){
                this.wenjuan.wtlist[index]={
                    "question_text": "", //问题
                    "question_type": "duo", // 'dan'单选, 'duo'多选, 'text'文本
                    "required": "Y", // 是否必答
                    "xxlist": [
                            {
                                "option_text": ""
                            },
                            {
                                "option_text": ""
                            },
                            {
                                "option_text": ""
                            },
                            {
                                "option_text": ""
                            }
                    ]
                }
            }else if(this.wenjuan.wtlist[index].question_type=='text'){
                this.wenjuan.wtlist[index]={
                    "question_text": "",
                    "question_type": "text",
                    "required": "Y",
                    // 无选项
                }
            }
        }

问题出现:在<el-select>组件中使用@change事件只触发了一次,可能是因为在选择项变化后,v-model的值没有发生实际变化,导致@change事件没有再次触发。

解决办法:检查一下在txChangeFn(index, item.question_type)方法中是否有修改item.question_type的逻辑,确保每次选择项变化后v-model的值都有实际变化。另外,还可以尝试在txChangeFn方法中手动将item.question_type设置为一个新的值,以确保@change事件能够再次触发。

2.修改后的值

txChangeFn(index, params) {

this.wenjuan.wtlist[index].question_type = params;

if (params === 'dan') {

this.wenjuan.wtlist[index].xxlist = [

{ option_text: "" },

{ option_text: "" },

{ option_text: "" },

{ option_text: "" }

];

} else if (params === 'duo') {

this.wenjuan.wtlist[index].xxlist = [

{ option_text: "" },

{ option_text: "" },

{ option_text: "" },

{ option_text: "" }

];

} else if (params === 'text') {

// 无需修改xxlist

}

}

修改this.wenjuan.wtlist[index].question_type后,直接修改该对象的属性而不是重新赋值整个对象,既可以不影响响应式。

相关推荐
倾颜2 小时前
从 textarea 到 AI 输入框:用 Tiptap 实现 / 命令、@ 引用和结构化请求
前端·langchain·next.js
kyriewen3 小时前
程序员连夜带团队跑路,省了23万:这AI太贵,真的用不起了
前端·javascript·openai
kyriewen4 小时前
你写的代码没有测试,就像出门不锁门——Jest + Testing Library 从入门到不慌
前端·单元测试·jest
yuzhiboyouye4 小时前
web前端英语面试
前端·面试·状态模式
canonical_entropy6 小时前
下一代低代码渲染框架 nop-chaos-flux 的设计原则
前端·低代码·前端框架
东方小月6 小时前
5分钟搞懂Harness Engineering(驾驭工程):从提示词到AI Agent的进化之路
前端·后端·架构
我叫黑大帅6 小时前
为什么需要 @types/react?解决“无法找到模块 react 的声明文件”报错
前端·javascript·面试
之歆6 小时前
DAY_21JavaScript 深度解析:数组(Array)与函数(Function)(一)
前端·javascript
XinZong7 小时前
【AI社交】基于OpenClaw自研轻量化AI社交平台实战
前端
Le_ee7 小时前
ctfweb:php/php短标签/.haccess+图片马/XXE
开发语言·前端·php