weixin_44637331 2022-01-23 11:35 采纳率: 100%
浏览 1980
已结题

v-model与三元运算符结合使用的BUG

问题遇到的现象和发生背景

最近一位后端同事在使用vue的v-model时,遇到一个问题。他是这样使用v-model的

<input type="text"   v-model="flag?msg2:msg1"/> 

看着挺不错的,一行代码就实现了。避免了v-if + v-else

<input type="text"   v-if="flag"  v-model="msg2"/> 
<input type="text"   v-else  v-model="msg1"/> 

但事与愿违,这并不能实现动态的双向绑定。
导致的问题:v-model 不会根据 flag 的值(布尔)动态的绑定msg2,但可以绑定msg1。当时我用v-if实现的他的目的。研究了几天,但还是不能解释这个奇怪的现象。

问题相关代码,请勿粘贴截图

这是我测试的代码。

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.js"></script>
</head>
<body>
    <div id="example-1">

        <div>
             <input type="checkbox" v-model="flag"> {{flag}}  target:{{flag?'msg2':'msg1'}}
        </div>

        <div>
            <input type="text"   v-model="flag?msg2:msg1"/>
        </div>

        <div>
            msg1: <input v-model="msg1"/>
        </div>
    
        <div>
            msg2:<input v-model="msg2"/>
        </div>

    </div>
    <script type="text/javascript">
        new Vue({
            el: '#example-1',
            data: {
                selected: 'A',
                flag: true,
                msg1:'',
                msg2: ''
            }
        })
    </script>
</body>
</html>
运行结果及报错内容

img

我的解答思路和尝试过的方法
  1. 换一种方式:用&&与|| 来实现三元运算符。

    <input type="text"   v-model="(flag && msg2) || msg1"/>
    

    结果编译通不过:SyntaxError: Invalid left-hand side in assignment in

  2. 给三元运算符加个小括号

    <input type="text"   v-model="(flag?msg2:msg1)"/>
    

    结果也编译通不过:SyntaxError: Invalid left-hand side in assignment in

我想要达到的结果

v-mdel 为什么 会导致 个问题

  • 写回答

4条回答 默认 最新

  • CSDN专家-showbo 2022-01-23 12:33
    关注

    改下面这样可以,

    <!DOCTYPE html>
    <html>
    <head>
        <script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.js"></script>
    </head>
    <body>
        <div id="example-1">
    
            <div>
                <input type="checkbox" v-model="flag"> {{flag}}  target:{{flag?'msg2':'msg1'}}
            </div>
    
            <div>
                <input type="text" v-model="model[flag?'msg2':'msg1']" />
            </div>
    
            <div>
                msg1: <input v-model="model.msg1" />
            </div>
    
            <div>
                msg2:<input v-model="model.msg2" />
            </div>
    
        </div>
        <script type="text/javascript">
           vue= new Vue({
                el: '#example-1',
                data: {
                    selected: 'A',
                    flag: true,
                    model: {
                        msg1: '',
                        msg2: ''
                    }
                }
            })
        </script>
    </body>
    </html>
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月6日
  • 已采纳回答 1月29日
  • 创建了问题 1月23日

悬赏问题

  • ¥50 MATLAB APP 制作出现问题
  • ¥15 wannier复现图像时berry曲率极值点与高对称点严重偏移
  • ¥15 利用决策森林为什么会出现这样·的问题(关键词-情感分析)
  • ¥15 DispatcherServlet.noHandlerFound No mapping found for HTTP request with URI[/untitled30_war_e
  • ¥15 使用deepspeed训练,发现想要训练的参数没有梯度
  • ¥15 寻找一块做为智能割草机的驱动板(标签-stm32|关键词-m3)
  • ¥15 信息管理系统的查找和排序
  • ¥15 基于STM32,电机驱动模块为L298N,四路运放电磁传感器,三轮智能小车电磁组电磁循迹(两个电机,一个万向轮),怎么用读取的电磁传感器信号表示小车所在的位置
  • ¥15 如何解决y_true和y_predict数据类型不匹配的问题(相关搜索:机器学习)
  • ¥15 PB中矩阵文本型数据的总计问题。