生活
vue双向绑定 、vue双向绑定例子
2023-04-12 01:33  浏览:25

Vue3 数据双向绑定与动态传值响应

Vue2的v-model与.sync是语法糖,props: ['value'], $emit('input', newVal);

Vue3对v-model进行了调整,取消了.sync

1. v-model="count" 双向绑定

2. v-model:countA="count" 双向绑定

3. :countB="count" 单向传值

4. :countC="count"    @update:countC="count = $event" 显示双向绑定

5. :countD="count"   dynamicName="countD" 动态传值响应,特殊情形下使用。做组态开发时可能会用到。

Vue2父组件与子组件的双向绑定怎么实现

1. 在组件内的data对象中创建一个props属性的副本

因为result不可写,所以需要在data中创建一个副本myResult变量,初始值为props属性result的值,同时在组件内所有需要调用props的地方调用这个data对象myResult。

Vue.component("switchbtn", {

template: "div @click='change'{{myResult?'开':'关'}}/div",

props: ["result"],

data: function () {

return {

myResult: this.result//data中新增字段

};

},

......

});

2. 创建针对props属性的watch来同步组件外对props的修改

此时在组件外(父组件)修改了组件的props,会同步到组件内对应的props上,但是不会同步到你刚刚在data对象中创建的那个副本上,所以需要再创建一个针对props属性result的watch(监听),当props修改后对应data中的副本myResult也要同步数据。

Vue.component("switchbtn", {

template: "div @click='change'{{myResult?'开':'关'}}/div",

props: ["result"],

data: function () {

return {

myResult: this.result

};

},

watch: {

result(val) {

this.myResult = val;//新增result的watch,监听变更并同步到myResult上

}

},

......

3. 创建针对props副本的watch,通知到组件外

此时在组件内修改了props的副本myResult,组件外不知道组件内的props状态,所以需要再创建一个针对props副本myResult,即对应data属性的watch。

在组件内向外层(父组件)发送通知,通知组件内属性变更,然后由外层(父组件)自己来变更他的数据

最终全部代码:

div id="app"

switchbtn :result="result" @on-result-change="onResultChange"/switchbtn

input type="button" value="change" @click="change"

/div

Vue.component("switchbtn", {

template: "div @click='change'{{myResult?'开':'关'}}/div",

props: ["result"],

data: function () {

return {

myResult: this.result//①创建props属性result的副本--myResult

};

},

watch: {

result(val) {

this.myResult = val;//②监听外部对props属性result的变更,并同步到组件内的data属性myResult中

},

myResult(val){

//xxcanghai 小小

this.$emit("on-result-change",val);//③组件内对myResult变更后向外部发送事件通知

}

},

methods: {

change() {

this.myResult = !this.myResult;

}

}

});

new Vue({

el: "#app",

data: {

result: true

},

methods: {

change() {

this.result = !this.result;

},

onResultChange(val){

this.result=val;//④外层调用组件方注册变更方法,将组件内的数据变更,同步到组件外的数据状态中

}

}

});

至此,实现了组件内数据与组件外的数据的双向绑定,组件内外数据的同步。最后归结为一句话就是:组件内部自己变了告诉外部,外部决定要不要变。

如何在Vue2中实现组件props双向绑定

在组件内的data对象中创建一个props属性的副本 因为result不可写,所以需要在data中创建一个副本myResult变量

如何在Vue2中使用双向绑定

Vue2 取消了 .sync 指令修饰符,推崇单向闭环的数据流。即:父级通过 props 向子级传递数据,子级如果需要修改数据就需要在父级添加监听事件,并在子级中去触发事件修改值。

在多数情况下,是不需要双向绑定的,单向数据流更容易追踪数据变化排查问题。但一些特定场景下,如弹窗,除了外部由父组件控制显示和隐藏外,组件内部也有关闭和取消等按钮需要控制显示和隐藏。这虽然可以通过触发事件让父级修改显示状态来实现,但每一个弹窗组件都需要做一遍这样的事总觉得很不爽。

v-model

v-model 是 Vue2 中唯一支持双向绑定的指令,用于表单控件绑定,但不代表它只能用在表单控件之上。在文档 使用自定义事件的表单输入组件 一节中提到了, v-model 其实是个语法糖。

input v-model="something"

!-- 等价于以下内容 --

input :value="something" @input="something = $event.target.value"

也就是说,你只需要在组件中声明一个 name 为 value 的 props ,并且通过触发 input 事件传入一个值,就能修改这个 value 。

父组件中引用

myComponent v-model="title"/myComponent

子组件

const myComponent = {

template: 'divh1{{value}}/h1button @click="changeTitle"Change/button/div',

props: {

value: String

},

methods: {

changeTitle() {

this.$emit('input', '子组件')

}

}

}

上面这个例子,最初显示的是父组件传入的 title ,点击子组件中的按钮后会修改显示值为子组件 。

组件内部控制关闭的弹窗

现在可以解决弹窗组件内部自行关闭的问题了。

Demo

多字段的双向绑定

一个组件只能定义一个 v-model ,假如想双向绑定多个值怎么办?

v-model 并没有限制 value 的数据类型,只是限制了是 一个值! 那么只需要把 value 的数据类型换成 Object 或者 Arr*** ,把多出的字段作为对象的属性或数组的元素传入,多少个都不是问题了。

从***实践角度出发,推荐只是特定场景下使用,比如自定义的表单组件。

vue双向绑定的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于vue双向绑定例子、vue双向绑定的信息别忘了在本站进行查找喔。

发表评论
0评