八、Vue中的input数据双向绑定实现原理

vue中的表单需要使用指令v-model实现数据的双向绑定。

使用v-model实现数据的双向绑定
输入框
<body>
  <div id="root">
    <!-- 通过v-model指令实现了输入框的值和data里的值双向绑定 -->
    <input type="text" v-model="inputValue"><br/>
    <span>你输入的内容是:{{inputValue}}</span>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: "#root",
      data() {
        return {
          inputValue: ''
        }
      }
    })
  </script>
</body>

在这里插入图片描述

选择框
<body>
  <div id="root">
    <div>
      <input type="checkbox" v-model="hobi" value="吃饭">吃饭
      <input type="checkbox" v-model="hobi" value="睡觉">睡觉
      <input type="checkbox" v-model="hobi" value="敲代码">敲代码
      <p>你的爱好是:{{hobi}}</p>
    </div>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: "#root",
      data() {
        return {
          hobi: []
        }
      },

      methods: {
      }
    })
  </script>
</body>
v-model的实现原理

text 和 textarea 元素使用 value 属性和 input 事件实现v-model的效果

<body>
  <div id="root">
    <input
      type="text"
      :value="inputValue"
      @input="handleInputChange"
    ><br/>
    <span>你输入的内容是:{{inputValue}}</span>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: "#root",
      data() {
        return {
          inputValue: ''
        }
      },

      methods: {
        // 这里的e就是input事件,在事件里我们可以拿到你正在输入的值
        handleInputChange(e) {
          // 拿到正在输入的值赋值给inputValue
          // 只要绑定了inputValue的元素,在inputValue发生改变后都会重新渲染
          this.inputValue = e.target.value
        }
      }
    })
  </script>
</body>

checkbox 和 radio 使用 checked 属性和 change 事件

<!--
实现思路:
1、首先会在data里面定义初始的数组,用于放选中的值
2、通过includes判断数组里是否包含选框的值来决定checked是true还是false
3、通过change事件获取选中值并判断数组里面是否有该值,有删除,没有就添加
-->

<body>
  <div id="root">
    <div>
      <input
        type="checkbox"
        :checked=hobi.includes("吃饭")
        @change="inhandleCheck"
        value="吃饭"
      >吃饭
      <input
        type="checkbox"
        :checked=hobi.includes("睡觉")
        @change="inhandleCheck"
        value="睡觉"
      >睡觉
      <input
        type="checkbox"
        :checked=hobi.includes("敲代码")
        @change="inhandleCheck"
        value="敲代码"
      >敲代码
      <p>你的爱好是:{{hobi}}</p>
    </div>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: "#root",
      data() {
        return {
          hobi: []
        }
      },

      methods: {
        inhandleCheck(e) {
          const v = e.target.value
          if(this.hobi.includes(v)) {
            // 有就删除
            this.hobi = this.hobi.filter(item => item !== v)
          } else {
            // 没有就添加
            this.hobi.push(v)
          }
        }
      }
    })
  </script>
</body>
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值