的使用在使用v-model之前,首先要知道v-model的用处和实际运行过程,这样便于理解,反而死记硬背语法;出于v-model的目的,您可以在表单输入、和元素中使用v-model命令来创建双向数据绑定。它会根据控件类型自动选择正确的方法来更新元素。尽管它很神奇,但v-model本质上只不过是语法糖。它负责监听用户输入事件来更新数据,并对一些极端场景做一些特殊处理。v-model的实际操作其实相当于下面输入代码的意思是,当执行input事件,将事件的值赋值给searchText,也就是第一段代码的意思。当searchText的变量值发生变化时,其他依赖该变量值的地方也会发生变化,从而形成了一个完整的,用户输入->数据变化->用户界面变化这样的双向绑定效果。所以,v-model其实只是一个语法糖。让我们少写代码。这种语法糖在VUE中随处可见。之后,我们会经常在自定义组件中使用它,在原生元素中使用它。我们只是需要直接添加,但是在组件中使用时,除了在父组件上添加这个属性外,当然还需要子组件进行一些配合。下面是详细步骤:假设我们当前的子组件在父组件中设置v-model叫做my-input,需要链接的数据叫做msgexportdefault{data(){return{msg:''}}}子组件中的配置首先需要接受一个名为`value`的prop,因为当父组件设置v-model,它默认会给子组件传递一个valueprop,就是这个隐藏代码:value="msg"@input="msg=arguments[0]"exportdefault{props:['value']}然后配置输入元素。对于上面隐藏代码的后半部分(将用户输入赋值给msg),我们自然不能写在父组件上。因此,需要将它移到一个真正有input元素的子组件中来完成这里的逻辑是通过emit调用父组件的输入事件(因为父组件的输入事件已经使用v-model语法糖定义,所以可以这样调用),并将用户输入的内容作为参数传递进入input事件,巧妙的实现了为了在子组件监听用户输入,改变父组件的参数msg,这样一个比较复杂的逻辑过程!Tips:理解这部分有三个关键点:1、事件的起点是子组件上nativeinput的oninput事件;2.这里父组件的需求是希望v-model绑定的input可以改变变量值,但是本身并不能直接获取用户的输入,所以需要调用emit方法来通过子组件传递参数,告诉它用户输入了什么;3.v-model本身的语法糖是针对原生表单控件的,因为在原生表单控件上,用户输入和提供的变量在同一个作用域内,所以可以access,这样一口气完成了整个过程,搞定了一个v-model;但是当我们使用包装的表单控件时,例如本文中的my-input控件,就会出现作用域问题。在这里,在父组件中,我们已经定义了需要由v-model为我们更改的变量,但是我们无法监视用户输入。用户输入的范围在哪里?答案在子组件,子组件需要如何让父组件知道?答案是emit函数;我们来看看整个过程中父子组件分担的工作:父组件:绑定数据变量,通过hidden定义自己的输入事件(给数据变量赋值)v-model代码,但缺少事件参数;child组件:监听用户输入,emit触发父组件的input事件并将用户输入作为参数传入,以便父组件为数据变量赋值
逻辑增强系列(一):吃透自定义组件v-model相关文章