03-学习vue笔记分享-v-model数据双向绑定

  1. 可以使用v-model指令的元素有哪些(至少列举出5个表单元素)?

Inputtextarea、radio、checkbox、select

2.v-model可以实现 表单元素和 Model 中数据的双向数据绑定,注意:v-model 只能运用在 表单元素中;

1、基本使用:

<body>
    <!-- 被app实例所控制的区域 -->
    <div id="app">
        <input type="text" v-model="message">
        <h2>{{message}}</h2>
    </div>

    <script src="../vue.js"></script>
    <script>
        // 创建实例对象
        const app = new Vue({
            // 指定控制的区域
            el: '#app',
            data: {
                message: "hello"
            },
            methods: {}
        });
    </script>
</body>

 

2、原理:

<body>
    <!-- 被app实例所控制的区域 -->
    <div id="app">
        <!-- <input type="text" v-model="message"> -->
        <input type="text" v-model="message" @input="valueChange">
        <input type="text" v-model="message" @input="message = $event.target.value">
        <h2>{{message}}</h2>
    </div>

    <script src="../vue.js"></script>
    <script>
        // 创建实例对象
        const app = new Vue({
            // 指定控制的区域
            el: '#app',
            data: {
                message: "hello"
            },
            methods: {
                valueChange(event) {
                    this.message = event.target.value;
                }
            }
        });
    </script>
</body>

分析:

1、input框有个input事件,用于监听用户输入的内容

2、绑定的事件需要加一个event参数保证运行成功

3、v-model其实是一个语法糖,背后包含俩个操作:

(1)v-bind绑定一个value属性

(2)v-on指令给当前元素绑定input事件

3、v-model搭配radio使用

<body>
    <!-- 被app实例所控制的区域 -->
    <div id="app">
        <!-- label确保点击文字也可以选中radio,为保证选择男女不能同时,可以加个name="sex"。相同name则会互斥,而value则是为了获取选择的值,默认选择男,sex双向绑定则会根据value刷新页面 -->
        <label for="male">
            <!-- <input type="radio" id="male" name="sex" value="男" v-model="sex">男 -->
            <!-- 当有v-model时可以不用加name保证俩个radio的互斥 -->
            <input type="radio" id="male" value="男" v-model="sex">男
        </label>
        <label for="female">
            <!-- <input type="radio" id="female" name="sex" value="女" v-model="sex">女 -->
            <!-- 当有v-model时可以不用加name保证俩个radio的互斥 -->
            <input type="radio" id="female" value="女" v-model="sex">女
        </label>
        <p>你的选择是:{{sex}}</p>
    </div>

    <script src="../vue.js"></script>
    <script>
        // 创建实例对象
        const app = new Vue({
            // 指定控制的区域
            el: '#app',
            data: {
                sex: "男"
            },
            methods: {}
        });
    </script>
</body>

 

 4.1、v-model搭配checkbox使用(单个checkbox)

<body>
    <!-- 被app实例所控制的区域 -->
    <div id="app">
        <label for="agree">
            <input type="checkbox" id="agree" v-model="isAgree">同意协议
        </label>
        <h2>你选择的是:{{isAgree}}</h2>
        <button :disabled="!isAgree">下一步</button>
    </div>

    <script src="../vue.js"></script>
    <script>
        // 创建实例对象
        const app = new Vue({
            // 指定控制的区域
            el: '#app',
            data: {
                isAgree: false,
            },
            methods: {}
        });
    </script>
</body>

 

4.2、v-model搭配checkbox使用(多个checkbox)

<body>
    <!-- 被app实例所控制的区域 -->
    <div id="app">
        <input type="checkbox" id="agree" value="篮球" v-model="hobbies">篮球
        <input type="checkbox" id="agree" value="足球" v-model="hobbies">足球
        <input type="checkbox" id="agree" value="羽毛球" v-model="hobbies">羽毛球
        <input type="checkbox" id="agree" value="乒乓球" v-model="hobbies">乒乓球
        <h2>你选择的是:{{hobbies}}</h2>
    </div>

    <script src="../vue.js"></script>
    <script>
        // 创建实例对象
        const app = new Vue({
            // 指定控制的区域
            el: '#app',
            data: {
                hobbies: []
            },
            methods: {}
        });
    </script>
</body>

 

分析:

1、单个勾选框,v-model绑定的是布尔值,此时input中的value不影响v-model的值

2、多个复选框,因为可以选择多个,所以对应的data中的属性是一个数组,当选择某一个时,会将input的value添加到数组中

 

5、v-model搭配select使用

<body>
    <!-- 被app实例所控制的区域 -->
    <div id="app">
        <!-- 单选 -->
        <select name="abc" v-model="fruit">
            <option value="苹果">苹果</option>
            <option value="葡萄">葡萄</option>
            <option value="香蕉">香蕉</option>
            <option value="西红柿">西红柿</option>
        </select>
        <h2>你选择的是:{{fruit}}</h2>

        <!-- 多选 -->
        <!-- multiple是拉选不是点选 -->
        <select name="abc" v-model="fruits" multiple>
            <option value="苹果">苹果</option>
            <option value="葡萄">葡萄</option>
            <option value="香蕉">香蕉</option>
            <option value="西红柿">西红柿</option>
        </select>
        <h2>你选择的是:{{fruits}}</h2>
    </div>

    <script src="../vue.js"></script>
    <script>
        // 创建实例对象
        const app = new Vue({
            // 指定控制的区域
            el: '#app',
            data: {
                fruit: "香蕉", //单选 字符串类型 
                fruits: [] //多选 数组类型
            },
            methods: {}
        });
    </script>
</body>

分析:

1、单选:绑定的是一个值(字符串),当我们选择option中的一个时,会将它对应的value赋值到data的fruit中;

2、多选:绑定的是一个数组,当拉选多个值时,会将它对应的value赋值到data的fruits中;

 

6、input中的值绑定

我们在真实开发中,不是将数据写死的,而是动态绑定获取的,因此,上文多个checkbox可做以下更改:

<body>
    <!-- 被app实例所控制的区域 -->
    <div id="app">
        <input type="checkbox" id="agree" value="篮球" v-model="hobbies">篮球
        <input type="checkbox" id="agree" value="足球" v-model="hobbies">足球
        <input type="checkbox" id="agree" value="羽毛球" v-model="hobbies">羽毛球
        <input type="checkbox" id="agree" value="乒乓球" v-model="hobbies">乒乓球
        <h2>你选择的是:{{hobbies}}</h2>
    </div>

    <script src="../vue.js"></script>
    <script>
        // 创建实例对象
        const app = new Vue({
            // 指定控制的区域
            el: '#app',
            data: {
                hobbies: []
            },
            methods: {}
        });
    </script>
</body>

 改进:

<body>
    <!-- 被app实例所控制的区域 -->
    <div id="app">
        <input type="checkbox" id="agree" value="篮球" v-model="hobbies">篮球
        <input type="checkbox" id="agree" value="足球" v-model="hobbies">足球
        <input type="checkbox" id="agree" value="羽毛球" v-model="hobbies">羽毛球
        <input type="checkbox" id="agree" value="乒乓球" v-model="hobbies">乒乓球
        <h2>你选择的是:{{hobbies}}</h2>

        <label v-for="item in originHobbies" :for="item">
            <input type="checkbox" :value="item" v-model="hobbies" :id="item">{{item}}
        </label>
    </div>

    <script src="../vue.js"></script>
    <script>
        // 创建实例对象
        const app = new Vue({
            // 指定控制的区域
            el: '#app',
            data: {
                hobbies: [],
                originHobbies: ["篮球", "足球", "羽毛球", "乒乓球", "台球"]
            },
            methods: {}
        });
    </script>
</body>

分析:

v:bind值绑定,:for=“item”和:id=“item”是为了确保每个for跟每个id代表的input对应起来!

因此,input中的值绑定,也就是想说v-bind的值绑定

 

7、v-model的修饰符

 1、lazy修饰符:

默认情况下数据的双向绑定是一旦input框的值发生变化data的数据会自动更新,而该修饰符会让数据在失去焦点或者回车的时候才更新数据,简称懒加载!

2、number修饰符:

默认情况下,input输入的数字是字符串类型,而当我们需要在数字输入框内处理的是数字类型,,则加.number可以在输入框中输入内容时自动转换为数字类型

3、trim修饰符:

可以去除输入框中输入内容首尾的空格

<body>
    <!-- 被app实例所控制的区域 -->
    <div id="app">
        <label for="1">
            <input type="text" id="1" v-model="message">
            <input type="text" id="1" v-model.lazy="message">
        </label>
        <h2>当前内容:{{message}}</h2>

        <label for="2">
            年龄:<input type="number" id="2" v-model="age">
            年龄:<input type="number" id="2" v-model.number="age">
        </label>
        <h2>年龄:{{age}} 类型:{{typeof age}}</h2>

        <label for="3">
            <input type="text" id="3" v-model="message">
            <input type="text" id="3" v-model.trim="message">
        </label>
        <h2>当前内容:-----{{message}}-----</h2>
    </div>

    <script src="../vue.js"></script>
    <script>
        // 创建实例对象
        const app = new Vue({
            // 指定控制的区域
            el: '#app',
            data: {
                message: "hello",
                age: 13
            },
            methods: {}
        });
    </script>
</body>

 1、lazy修饰符实例:

 2、number修饰符实例:

3、trim修饰符实例:

 

 

可见得message不加修饰符后面的空格还在!

 

 

补充:

  1. Vue中过滤器的用法经过过滤器处理后,会不会改变数据的原始值?多个过滤器是否可以串联?当全局过滤器和局部过滤器重名时,会采用全局还是局部过滤器?

定义:对内容或数据进行过滤(二次处理)的一种方式
写法:Vue.filter("过滤器名称",过滤方式);
使用:过滤器类似于管道流
种类:局部过滤器全局过滤器

全局过滤器定义:

Vue.filter('replaceStr', function(msg) {

          // replace()方法:替换字符串中敏感词汇,用*替换掉敏感词

          return message.replace(/毛病/g, '**')

      });

局部过滤器:

//定义私用局部过滤器。只能在当前 vue 对象中使用

            filters: {

                strDeal(str) {

                    let arr = [];

                    if (str.includes("呱")) {

                        arr.push(str+"可爱的小青蛙");

                        return arr.join("");

                    }

                }

            }

注意:

过滤器实质不改变原始数据

当局部过滤器与全局过滤器名称相同时,就近原则来调用,即局部过滤器优先于全局过滤器被调用;

一个表达式可以使用多个过滤器

过滤器之间需要用管道符“|”隔开。其执行顺序从左往右

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值