Vue.js 章6 v-model与表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="Vue.2.6.10.js"></script>
</head>
<body>
    <!-- v-model在文本域的用法 -->
    <div id="app1">
        <textarea name="" v-model="text" id="textarea" cols="30" rows="10"></textarea><!--拼音不会更新-->
        <textarea name="" @input = 'handleInput' id="textarea" cols="30" rows="10"></textarea><!--实时更新-->
        <!-- 使用v-model以后,其显示的值只依赖绑定的数据,初始化的value属性和textarea标签之间的值都不会起作用 -->
        <p>输入内容:</p>
        <p style="white-space: pre;">{{ text }}</p>
    </div>

    <div id="app2">
        <input type="radio" :checked = 'picked' @click = 'toggleChecked'>
        <label for="">单选按钮</label>
    </div>
<!-- 组合使用实现互斥选择 -->
    <div id="app3">
        <input type="radio" v-model="picked" value="html!" id="html">
        <label for="html">Html</label>
        <br>
        <input type="radio" v-model="picked" value="css!" id="css">
        <label for="css">Css</label>
        <br>
        <input type="radio" v-model="picked" value="js!" id="js">
        <label for="js">JavaScript</label>
        <br>
        <p>被选中的项:{{ picked }}</p><!--输出的是value中的值-->
        <!-- 原理:v-model配合value,点击按钮/标签——
        v-model你可以理解成是value的更高级,:value(v-bind)属于数据单向绑定,v-model属于双向绑定
        v-model官方给出的说法是:这其实是一个简写的形式,v-model实际执行的是下面的绑定:
        <input type="text" v-bind:value="dataA" v-on:input="dataA = $event.target.value" />
        在本例中则是:<input type="text" v-bind:value="picked" v-on:click="picked = $event.target.value" />
        v-model是动态绑定值到value,然后监听input的input事件获取值后赋给dataA的一个过程。 -->
    </div>

    <!-- 复选框 -->
    <div id="app4">
        <input type="checkbox" v-model="checked" id="checked">
        <label for="checked">选择状态:{{ checked }}</label>
        <br>
        <input type="checkbox" v-model="multichecked" value="html!" id="html">
        <label for="html">Html</label>
        <br>
        <input type="checkbox" v-model="multichecked" value="css!" id="css">
        <label for="css">Css</label>
        <br>
        <input type="checkbox" v-model="multichecked" value="js!" id="js">
        <label for="js">JavaScript</label>
        <br>
        <p>被选中的项:{{ multichecked }}</p>
    </div>

    <div id="app5">
        <select v-model="selected" id="" multiple>
            <!-- 如果option含有value属性,v-model就会优先匹配value的值,如果没有就会匹配option标签内的text -->
            <!-- 给select添加multiple就可以多选 -->
            <!-- 在业务中通常用v-for动态输出option、value与text -->
            <option>html</option>
            <option>css</option>
            <option>js</option>
            <option>jq</option>
            <option>vue</option>
        </select>
        <p>选择的项:{{ selected }}</p>
    </div>
    <!-- 绑定值 -->
    <div id="app6">
        <input type="radio" v-model="picked" :value="value">
        <!-- 别忘了v-model会匹配value的值 -->
        <label for="">单选按钮</label>
        <p>{{ picked }}</p>
        <p>{{ value }}</p>

        <input type="checkbox" v-model="toggle" :true-value="value1" :false-value="value2" >
        <label for="">复选框</label>
        <p>{{ toggle }}</p>
        <p>{{ value1 }}</p>
        <p>{{ value2 }}</p>
    </div>

    <!-- 常见的表单修饰符 -->
    <div id="app7">
        <input type="text" v-model.lazy="message">
        <!-- 在输入框内容发生改变后才更新 -->
        <p>{{ message }}</p>
        <input type="text" v-model.number="messageNum">
        <!-- 将输入转换为number类型 -->
        <p>{{ messageNum }}</p>
        <input type="text" v-model.trim="messageTrim">
        <!-- 过滤首尾空格 -->
        <p>{{ messageTrim }}</p>
        <!-- 都会同时影响输入框中的值 -->
    </div>
</body>
<script>
    var app1 = new Vue({
       el:"#app1",
       data:{
           text:''
       },
       methods: {
           handleInput:function(e){
               console.log(e,e.target);
               this.text = e.target.value;
               //InputEvent {isTrusted: true, data: "s", isComposing: true, inputType: "insertCompositionText",
                // dataTransfer: null, …} 
                // <textarea name id=​"textarea" cols=​"30" rows=​"10">​</textarea>​
           }
       },
    });

    var app2 = new Vue({
       el:"#app2",
       data:{
           picked:true
       },
       methods:{
           toggleChecked:function(){
               this.picked = !this.picked;
           }
       }
    });

    var app3 = new Vue({
        el:"#app3",
        data:{
            picked:''
        }
    });

    var app4 = new Vue({
       el:"#app4",
       data:{
           checked:'',//这里应该是Vue内置的吧,不然真的没道理...
        //    multichecked:'' 会变为true/false,错误写法
           multichecked:[]
       } 
    });

    var app5 = new Vue({
       el:"#app5",
       data:{
            selected:['html','css'],//要用ctrl+option的方式多选也是醉了
       }, 
    });

    var app6 = new Vue({
       el:"#app6",
       data:{
            picked:false,
            value:123,//选中时app.picked===app.value
            toggle:false,
            value1:'a',//选中:app.toggle === app.value1,反之value2  这个应该也是自带的吧...
            value2:'b'
       } 
    });

    var app7 = new Vue({
       el:"#app7",
       data:{
            message:'',
            messageNum:'',
            messageTrim:''
       }, 
    });
</script>
</html>
原文地址:https://www.cnblogs.com/linbudu/p/10847794.html