美文网首页前端开发那些事儿
Vue3 | 双向绑定 及其 多种指令、修饰符的实践

Vue3 | 双向绑定 及其 多种指令、修饰符的实践

作者: 凌川江雪 | 来源:发表于2021-03-07 01:40 被阅读0次

    完整原文地址见简书https://www.jianshu.com/p/7418a4246478

    更多完整Vue笔记目录敬请见《前端 Web 笔记 汇总目录(Updating)》


    本文内容提要

    • v-model双向绑定【input例】

    • v-model双向绑定【textarea例】

    • v-model双向绑定【CheckBox例】

    • 使用true-valuefalse-value自定义checkbox的布尔绑定值

    • v-model双向绑定【CheckBox例(升级版)】

    • v-model双向绑定【radio例】

    • v-model双向绑定【select(单选)例】

    • v-model双向绑定【select(多选)例】

    • 使用v-for优化以上代码,实现同样效果

    • 点击UI存储对应数据结构 的技巧

    • v-model.lazy修饰符【input例】

    • v-model.number修饰符【input例】

    • v-model.trim修饰符【input例】

    v-model双向绑定【input例】

    如下代码,input的内容 与 testString字段的数据 双向绑定,
    文本显示了 testString字段的数据的内容,
    此时,

    手动改动 testString字段的值,
    input的内容会跟着改变;

    手动输入改变input的内容,
    testString字段的值也会跟着改变(体现在{{testString}}这里);
    所谓 双向绑定:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Hello World! heheheheheheda</title>
        <script src="https://unpkg.com/vue@next"></script>
    </head>
    
    <body>
        <div id="heheApp"></div>
    </body>
    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: 'luelueluelalala'
                }
            },
            template: `
            <div>
                {{testString}}
                <input v-model="testString">
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    </html>
    
    手动改动 testString字段的值,input的内容会跟着改变; 手动改变input的内容, testString字段的值也会跟着改变

    v-model双向绑定【textarea例】

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: 'luelueluelalala'
                }
            },
            template: `
            <div>
                {{testString}}
                <textarea v-model="testString" />
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    
    效果:

    v-model双向绑定【CheckBox例】

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: false
                }
            },
            template: `
            <div>
                {{testString}}
                <input type="checkbox" v-model="testString" />
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    
    运行效果: 勾选:

    使用true-valuefalse-value自定义checkbox的布尔绑定值

    true-value定义的值覆盖checkbox的true
    false-value定义的值覆盖checkbox的false

    即当checkbox的值为true-value定义的字符串时,
    checkbox显示为选中状态,
    false-value时为不选中状态:

    注意这里是用字符串做值,有双引号包裹;
    原始的布尔值,没有字符串包裹;

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: "lueluelue"
                }
            },
            template: `
            <div>
                {{testString}} <br>
                <input type="checkbox" v-model="testString" 
                    true-value="heheda" false-value="lueluelue">
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    
    效果:

    v-model双向绑定【CheckBox例(升级版)】

    CheckBox组件配置value属性,
    使用v-modelCheckBox组件与一个数组双向绑定,
    CheckBox组件被勾选时,
    勾选到的CheckBox组件value属性值会加到其对应绑定的v-model数组字段中:

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: [],
                    checkboxValue1: "heheda",
                    checkboxValue2: "lueluelue",
                    checkboxValue3: "xixixi"
                }
            },
            template: `
            <div>
                {{testString}} <br>
                {{checkboxValue1}} <input type="checkbox" v-model="testString" :value="checkboxValue1" /><br>
                {{checkboxValue2}} <input type="checkbox" v-model="testString" :value="checkboxValue2" /><br>
                {{checkboxValue3}} <input type="checkbox" v-model="testString" :value="checkboxValue3" />
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    
    运行效果:

    v-model双向绑定【radio例】

    区分一下这个内容:
    CheckBox可以多选,选中数据可以用数组存储;
    radio只能单选,选中数据 按逻辑应用 一个变量字段存储;

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: '',
                    checkboxValue1: "heheda",
                    checkboxValue2: "lueluelue",
                    checkboxValue3: "xixixi"
                }
            },
            template: `
            <div>
                {{testString}} <br>
                {{checkboxValue1}} <input type="radio" v-model="testString" :value="checkboxValue1" /><br>
                {{checkboxValue2}} <input type="radio" v-model="testString" :value="checkboxValue2" /><br>
                {{checkboxValue3}} <input type="radio" v-model="testString" :value="checkboxValue3" />
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    

    v-model双向绑定【select(单选)例】

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: '',
                    checkboxValue1: "heheda",
                    checkboxValue2: "lueluelue",
                    checkboxValue3: "xixixi"
                }
            },
            template: `
            <div>
                {{testString}} <br>
                <select v-model="testString">
                    <option disabled value=''>请选择内容</option>
                    <option :value="checkboxValue1">{{checkboxValue1}}</option>
                    <option :value="checkboxValue2">{{checkboxValue2}}</option>
                    <option :value="checkboxValue3">{{checkboxValue3}}</option>
                </select>
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    

    v-model双向绑定【select(多选)例】

    注意两个地方——数组字段multiple关键字:

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: [],
                    checkboxValue1: "heheda",
                    checkboxValue2: "lueluelue",
                    checkboxValue3: "xixixi"
                }
            },
            template: `
            <div>
                {{testString}} <br>
                <select v-model="testString" multiple>
                    <option :value="checkboxValue1">{{checkboxValue1}}</option>
                    <option :value="checkboxValue2">{{checkboxValue2}}</option>
                    <option :value="checkboxValue3">{{checkboxValue3}}</option>
                </select>
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    
    效果:

    使用v-for优化以上代码,实现同样效果

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: [],
                    options:[{
                        text: 'heheda', value: 'heheda'
                    },{
                        text: 'lueluelue', value: 'lueluelue'
                    },{
                        text: 'xixixi', value: 'xixixi'
                    }]
                }
            },
            template: `
            <div>
                {{testString}} <br>
                <select v-model="testString" multiple>
                    <option v-for="item in options" :value="item.value">{{item.text}}</option>
                </select>
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    

    点击UI存储对应数据结构 的技巧

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: [],
                    options:[{
                        text: 'heheda', value: {value: 'heheda'}
                    },{
                        text: 'lueluelue', value: {value: 'lueluelue'}
                    },{
                        text: 'xixixi', value: {value: 'xixixi'}
                    }]
                }
            },
            template: `
            <div>
                {{testString}} <br>
                <select v-model="testString" multiple>
                    <option v-for="item in options" :value="item.value">{{item.text}}</option>
                </select>
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    
    效果:

    v-model.lazy修饰符【input例】

    .lazy修饰的v-model属性,其对应配置的组件,如input,
    不再会在往input输入内容时,即时性双向同步数据了,

    而是在往input输入内容后,
    点击其他组件或者位置使得input失去焦点时,
    再进行双向数据同步

    这样再某些场景下,可以减少多余的大部分事件的处理,
    达到提升性能的效果;

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: "lueluelue"
                }
            },
            template: `
            <div>
                {{testString}} <br>
                <input v-model.lazy="testString">
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    

    效果:
    没有即时同步:

    点击其他地方时同步:

    v-model.number修饰符【input例】

    使得输入框在输入的内容后 通过双向绑定特性 将值存进数据字段的时候,
    会先将值(当然主要是支持数字内容的字符串) 转换成number类型,
    再存进数据字段

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: "123"
                }
            },
            template: `
            <div>
                {{typeof testString}} <br>
                <input v-model.number="testString">
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    

    运行,初始为String类型,因初始赋值为String类型:

    随后,点击输入数字,会转换成number类型:

    v-model.trim修饰符【input例】

    v-model.trim修饰符,
    使得输入框在输入的内容后 通过双向绑定特性 将值存进数据字段的时候,
    会先将值 的 前后的空格去除(值的中间存在的空格不去除),
    再存进数据字段

    <script>
        const app = Vue.createApp({
            data() {
                return {
                    testString: "123"
                }
            },
            template: `
            <div>
                {{testString}} <br>
                <input v-model.trim="testString">
            </div>`
        });
    
        const vm = app.mount('#heheApp');
    </script>
    

    .trim修饰符之前:

    .trim修饰符之后:

    相关文章

      网友评论

        本文标题:Vue3 | 双向绑定 及其 多种指令、修饰符的实践

        本文链接:https://www.haomeiwen.com/subject/pnmfqltx.html