Vue中v-model的使用和原理

v-model的特点:

双向数据绑定:从数据到视图,从视图到数据

v-model在一些常用标签中的使用:
  • v-model与标签里的value属性进行双向绑定
<div id="app">
		// input输入框
      <input type="text" placeholder="输入内容" v-model="message" />
      <p>{{message}}</p>
      	// textarea文本框
      <textarea v-model="message2" cols="30" rows="10"></textarea>
      <p>{{message2}}</p>
      //多组的勾选框,收集到的值应该用数组收集
      <div style="margin-top: 20px">
        <input type="checkbox" id="jack" value="Jack" v-model="checkedNames" />
        <label for="jack">Jack</label>
        <input type="checkbox" id="John" value="John1" v-model="checkedNames" />
        <label for="John">John1</label>
        <input type="checkbox" id="Mike" value="Mike1" v-model="checkedNames" />
        <label for="Mike">Mike1</label>
        <p>{{checkedNames}}</p>
      </div>
      	// 单选框
      <div style="margin-top: 20px">
        <input type="radio" id="one" value="One" v-model="picked" />
        <label for="one">One</label>
        <input type="radio" id="two" value="Two" v-model="picked" />
        <label for="two">Two</label>
        <p>{{picked}}</p>
      </div>
    </div>
    <script>
      const vm = new Vue({
        el: "#app",
        data() {
          return {
            message: "",
            message2: "",
            checkedNames: [],
            picked: "",
          };
        },
      });

执行结果如下:
在这里插入图片描述

v-model双向绑定的原理:
  • 从数据到视图:利用Es5的Object.defineProperty方法进行数据劫持。
  • 从视图到数据:为添加v-model的元素添加input监听事件,实时获取input的value值。
    从数据到视图:
	let person = {
	        name: "张三",
	        sex: "男",
	      };
	      //对person对象进行了数据劫持
      Object.defineProperty(person, "age", {
         value: 19,
        // enumerable: true, //控制属性是否可以枚举,默认值为flase
        // writable: true, //控制属性是否可以被修改默认值是flase
        // configurable: true, //控制属性是否可以被删除,默认值是flase

        //当有人读取person的age属性时,get函数(getter)就会被调用
        get(){
            console.log('有人读取age属性了');
        },
        
        //当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
        set(Newvalue){
            console.log('有人修改age属性了,且值为',Newvalue);
            //在此处将修改后的值重新赋值给data中对应的属性,从而引起页面更新
        }
      });

从视图到数据:

  • 给input添加监听事件
 <input type="text" v-model="data1">
let input = document.querySelector('input');
      input.addEventListener('input',function(e){
      // newValue为输入框中现在的值
        let newValue = e.target.value;
        //在此处操作,将新文本值赋值给data里面对应的属性,即可引起从视图改变到数据的更新
      })
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值