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

完整原文地址见简书

本文内容提要

  • 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的truefalse-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修饰符之后:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌川江雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值