Vue中表单绑定的原理

47 阅读1分钟

我们在用Vue封装好的表单时,是非常方便的,下面我们一起来看看Vue表单实现原理,像这种问题,我们面试偶然也会遇到。

// 首先让我们了解一下表单的几种类型
// 1。 input[text/color/password/email]
// 2。 textarea
// 3。 input[file] 文件上传,直接上传
// 4。 input[checkbox/radio] 
// 5。 select

// 首先我们理解Vue中的表单,我们要着重理解一下v-model
// <1>对普通的文本框来讲 v-model = :value + @input  代码如下:
// 这里不用v-model 的写法
<input text="text" :value="name " @input="name = $event.target.value"/>
// 用v-model 的写法
<input text="text" v-model="name"/> // 这样看,vue让我开发少些了很多代码,这样看不明显,下面的例子应更能体现

// <2>对radio和checkbox来讲  v-model = :checked + @change,这里分为单选按和多选按钮
// 单选代码如下:
// 这里不用v-model 的写法
  genderArr: [
              { id: 1, label: '男', value: 1 },
              { id: 2, label: '女', value: 2 },
              { id: 3, label: '保密', value: 3 }
            ]
  gender: 1
  <span v-for="item in genderArr">
      <input
          type="radio" 
          :value="item.value" 
          :checked = "gender===item.value"
          @change="gender===parseIn($event.target.vlue)"
          />
          <span v-text='item.label'></span>
  </span>
// 用v-model 的写法
<span item in genderArr>
   <input type="radio" :value="item.value"  v-model="gender"  />
    <span v-text='item.label'></span>
</span>

// 多选代码如下:
 favArr: [
          { id: 1, label:'足球', value: 'football' },
          { id: 2, label:'篮球', value: 'basketball' },
          { id: 3, label:'乒乓球', value: 'pingbang' },
          { id: 4, label:'跑步', value: 'run' },
          { id: 5, label:'编程', value: 'coding' }
        ],
        favCbArr: [],
 // 这里不用v-model 的写法
  <span v-for="item in favArr">
      <input
          type="radio" 
          :value="item.value" 
          :checked='favCbArr.includes(item.value)'
           @change='$event.target.checked ? favCbArr.push(item.value) : favCbArr=favCbArr.filter(e=>e!==item.value)'
          />
          <span v-text='item.label'></span>
  </span>
  // 用v-model 的写法
   <span v-for='item in favArr'>
      <input
        type="checkbox"
        v-model='favCbArr'
        :value='item.value'
      />
      <span v-text='item.label'></span>
    </span>