Vue.js(四):表单输入绑定(单向数据流和多向数据流)

一、v-model指令

1、双向数据流:

  • 模型(Model)和视图(View)之间相互影响
  • 通俗来讲,Vue的代码变了,HTML的代码也跟着变;HTML代码中v-model对应的值发生变化,Vue代码中的data的值也发生变化.
  • v-model是双向数据流的代表

2、单向数据流:

  • 模型(Model)影响了视图(View)的渲染
  • 换句话说,Vue的数据的变化影响了HTML的渲染
  • mustache表达式“{{}}”是单向数据流的代表

3、单向数据流举例

 <div id="app">
        <input :value="inputValue"/><!--做绑定,给inputValue赋值,这是一个单向数据流-->
    </div>
<script>
    var app = new Vue({//建立代码段,创建Vue对象
        el:'#app',
        data:{//声明数据
            inputValue:'hello'
        }
    })
</script>

在以上这段代码中,input渲染出输入框中的值只能是hello,没法通过改变输入框中的值来改变模型中的data,如果这个时候使用{{inputValue}},效果是一样的,都是单向数据流。一般,取变量的值都是单向数据流的概念。

4、双向数据流举例

    <div id="app">
        <input  v-model="inputValue"/><!--如果变成v-model指令,既能得到inputValue的值,又能改变inputValue的 值-->

    </div>

<script>

    var app = new Vue({
        el:'#app',
        data:{
            inputValue:'hello'
        }
    })
</script>

在以上这段代码中,如果输入框中的值改变改变,inputValue的值也跟着改变。数据影响页面,模型影响视图,视图影响模型。

<div id="app">
    <select v-model="sltValue">
        <option value="1">天津</option>
        <option value="2">New York</option>
    </select>
</div>
<script>
    var app = new Vue({//建立代码段,创建Vue对象
        el:'#app',
        data:{//声明数据
            inputValue:'hello',
            sltValue:2
        }
    })
</script>

在以上这段代码中,sltValue的默认值是2,则选择框的值是New York。如果第二个option没有value,写作

<option>2</option>

那么这个选择框的值是这个option的文本2。value优先,但是没有value的话,它会去选择文本。当然这种写法是不规范的行为。很少select下不写value,去选择文本。

select的value值往往是文本存放在数据库的主键id,标准结果是select下的option有value值也有文本,这样才有开发的价值。

二、v-model指令所适用的表单域

用 v-model 指令在表单 input、 textarea及 select元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

举例说明:

<div id="app">
    <input  v-model="inputValue"/><!--输入框-->
    <textarea v-model="txt"></textarea><!--文本框-->
    <input type="radio"  v-model="picked" value="javascript" /> js<!--单选-->
    <input type="checkbox" value="cked1" /><!--多选-->
    <input type="checkbox"  v-model="cked" value="java"/> java
    <input type="checkbox"  v-model="cked"  value="c#"/> C#
    <input type="checkbox"  v-model="cked" value="php"/> PHP
</div>
 var app = new Vue({
        el:'#app',
        data:{
            inputValue:'hello',
            txt:'txtArea',
            picked:'js',//如果单选框的值不是js,则未被选中
            cked1:false,
            cked:['java','php']//此时已选的是java和php
        }
    })

v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件:

  • text 和 textarea 元素使用 value属性和 input 事件;
  • checkbox 和 radio 使用 checked属性和 change 事件;
  • select 字段将 value作为 prop 并将 change 作为事件。

三、值绑定

1、如果radio的v-model 的值 和 :value 一致,就呈现选中状态;否则,就是未选中

2、如果radio的状态是选中状态,v-model的值 和 value 的值一致

举例说明:

<div id="app">  
<input type="radio" v-model="picked" :value="val"/>
        {{picked}}
         {{val}}
<div>
<script>
    var app = new Vue({
        el:'#app',
        data:{
            picked:true,
            val:1,
        }
    })
</script>

下面这个例子中,复选框的初值是v-model中toggle的值,如果选中,toggle的值变成val1,如果未选中,则toggle的值变成val2。这个值的改变可以转换成状态的切换,比如隐藏显示、错误提示和成功提示等。

<div id="app">  
<input type="checkbox" v-model="toggle"
               :true-value="val1"
               :false-value="val2"/>
        <label>复选框</label>
        <p>{{toggle}}</p>
        <p>{{val1}}</p>
        <p>{{val2}}</p>
</div>
<script>
    var app = new Vue({
        el:'#app',
        data:{
            toggle:false,
            val1:'val1',
            val2:'val2'
        }
    })
</script>

四、修饰符

1、修饰符.lazy

在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步.

举例说明:

<div id="app">
    <!-- 在“change”时而非“input”时更新 -->
	<input v-model.lazy="msg" >
</div>
<script>
    var app = new Vue({
        el:'#app',
        data:{
           msg:'hello'
        }
    })
</script>

上面的例子,如果确定鼠标离开输入框失去焦点之后,确定已经输入完成才实现懒加载。

2、修饰符.number

如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number修饰符。

举例说明:

<div id="app">
	<input v-model.number="age" type="number">
</div>
<script>
    var app = new Vue({
        el:'#app',
        data:{
           age:12
        }
    })
</script>

这通常很有用,因为即使在 type=“number” 时,HTML 输入元素的值也总会返回字符串。如果这个值无法被 parseFloat() 解析,则会返回原始的值。比如,如果age的值赋‘aa’字符串,则就返回‘aa’。

3、修饰符.trim

如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim修饰符

举例说明:

<div id="app">
	<input v-model.trim="msg">
</div>
<script>
    var app = new Vue({
        el:'#app',
        data:{
           msg:' hello '
        }
    })
</script>

上面这段代码给msg赋值有首尾空白字符,那么返回值就是’hello’。

发布了17 篇原创文章 · 获赞 15 · 访问量 880

猜你喜欢

转载自blog.csdn.net/abc701110/article/details/104974210