vue自定义组件实现双向数据绑定,vue如何实现双向绑定的

  vue自定义组件实现双向数据绑定,vue如何实现双向绑定的

  本文主要详细介绍vue自定义组件双向绑定的实现。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。

  场景:

  我们比较了父子组件之间的常见交互方式:

  父组件通过props将数据流入子组件;

  子组件通过$emit将更新后的数组发送给父组件;

  今天我们用另一种方式实现交互,参考输入框的v模型,实现自定义组件的双向数据绑定。

  即当父组件的值改变时,子组件的值也相应改变;反之,子组件的值改变,父组件的值也相应改变。

  子组件定义:

  由于不能直接修改props属性值,所以我们在这里定义valueData,通过监控实时接收值,通过click方法修改valueData。

  这里注意模型语法sugar prop是接收到的prop属性值,这是一致的。事件是首先传递的事件名称。

  代码如下:

  模板

  差异

  Div{{ { `子组件值:${value}` }}/div

  Div @click=click 单击此处修改值/div

  /div

  /模板

  脚本

  导出默认值{

  名称: ,

  型号:{

  属性:“值”,

  事件:“更改”

  },

  道具:{

  值:数字

  },

  组件:{},

  data() {

  返回{

  值数据:“”

  };

  },

  观察:{

  值(新值,旧值){

  this . value data=new value;

  Console.log(`子组件值:$ { new value } `);

  }

  },

  已创建(){

  },

  已安装(){

  },

  方法:{

  单击(){

  this.valueData

  这个。$emit(change ,this . value data);

  }

  }

  };

  /脚本

  style lang=less 范围

  /风格

  父组件定义:

  父组件通过v-model绑定文本值。名称不一定是值,而是符合命名约定的任何其他字符串。这是正文。

  在子组件通过change事件更新数据后,垂直模式绑定值会更改。

  或者在父组件修改了文本值之后,子组件的值会发生变化。

  代码如下:

  模板

  差异

  Div{{ { `父组件值:${text}` }}/div

  Div @click=click 单击此处修改值/div

  span - /span

  测试儿童v-model= text /测试儿童

  /div

  /模板

  脚本

  从“@/views/TestChildren”导入test children;

  导出默认值{

  名称: ,

  组件:{ TestChildren },

  data() {

  返回{

  正文:1

  };

  },

  已创建(){

  },

  已安装(){

  },

  观察:{

  文本(新值,旧值){

  Console.log(`父组件值:$ { new value } `);

  }

  },

  方法:{

  单击(){

  this . text-;

  }

  }

  };

  /脚本

  style lang=less 范围

  /风格

  结果:

  将代码直接复制到您自己的项目测试中。是父组件更改值还是子组件更改值。由v-mode绑定的两个组件的值总是一致的。

  问与答:

  有同学问,这不是和通过props向下发送数据,再通过$emit向上发送数据一样吗?也能达到我的双向绑定效果。否则,如果我们没有通过v-model,那么我们必然会在父组件中编写这样的代码:

  test-children @ change= change text /test-children

  然后通过定义changeText方法修改文本值。

  想象一下,当我们的页面很复杂,引用的组件数量巨大时,我们需要在页面中定义十几二十个方法。可读线大大减少,增加了维护成本。

  扩展:

  vue2.3以后提供了sync模式,也可以实现双向绑定。

  写入父组件:

  测试子代:value . sync= text /测试子代

  您不需要在子组件中使用下面的模型定义,只需删除它们。

  型号:{

  道具:“值”,

  事件:“改变”

  },

  向父组件传递数据使用以下方法:

  这个。$emit(update:value ,this . value data);

  这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: