前端开发那些事儿

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

2021-03-07  本文已影响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修饰符之后:
上一篇下一篇

猜你喜欢

热点阅读