注意: 子组件不能直接修改prop过来的数据,会报错

方案一:

  1. 用data对象中创建一个props属性的副本

  2. watch props属性 赋予data副本 来同步组件外对props的修改

  3. watch data副本,emit一个函数 通知到组件外

HelloWorld组件代码如下:(代码里面有相应的注释)

  1. <template>
  2. <div class="hello">
  3. <h1 v-show="visible">测试显示隐藏</h1>
  4. <div @click="cancel">点我点我</div>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. export default {
  10. name: 'HelloWorld',
  11. props: {
  12. value: {
  13. type: Boolean,
  14. default:false
  15. }
  16. },
  17. data () {
  18. return {
  19. visible: false
  20. }
  21. },
  22. watch:{
  23. value(val) {
  24. this.visible = val;
  25. },
    // 只有这一步 才触发父组件的方法 由父组件的 paretnVisibleChange 方法去改变父组件的数据
  1.   visible(val) { this.$emit("paretnVisibleChange",val); } },
      // 子组件修改的只能是子组件 本身的data数据
  2. methods:{
  3. cancel(){
  4. this.visible = !this.visible;
  5. }
  6. },
    // 注意这段代码 为了同步父组件的数据
  7. mounted() {
  8. if (this.value) {
  9. this.visible = true;
  10. }
  11. }
  12. }
  13. </script>
  14. <style scoped>
  15.  
  16. </style>

父组件代码如下:

  1. <template>
  2. <div id="app">
  3. <HelloWorld :value = 'visible' @paretnVisibleChange="visibleChange" />
  4. </div>
  5. </template>
  6.  
  7. <script>
  8. import HelloWorld from './components/HelloWorld'
  9.  
  10. export default {
  11. name: 'App',
  12. components: {
  13. HelloWorld
  14. },
  15. data () {
  16. return {
  17. visible: true
  18. }
  19. },
  20. methods:{
    // 父子组件就是靠的这个方法改变数据的
  21. visibleChange(val){
  22. this.visible = val;
  23. }
  24. }
  25. }
  26. </script>

方案一 的缺点就是 父组件必须有个 visibleChange 这样的方法,有点累赘。

这时候 想到了 v-model 

因为

  1. <input v-model = 'someThing'>

是下面这段代码的语法糖

  1. <input :value = 'someThing' @input = 'someThing = $event.target.value'>

也就是说 v-mode 自带了 一个改变父组件的方法 类似方案一的   paretnVisibleChange

但是使用 v-model 的时候 需要注意两点:

1. 子组件要接受  value  属性

2. value改变时 要触发input 事件

方案二:

HelloWorld 子组件的代码如下;

  1. <template>
  2. <div class="hello">
  3. <h1 v-show="visible">测试显示隐藏</h1>
  4. <div @click="cancel">点我点我</div>
  5. </div>
  6. </template>
  7.  
  8. <script>
  9. export default {
  10. name: 'HelloWorld',
  11. props: {
  12. value: {
  13. type: Boolean,
  14. default:true
  15. }
  16. },
  17. data () {
  18. return {
  19. visible: false
  20. }
  21. },
  22. watch:{
  23. value(val) {
  24. this.visible = val;
  25. },
    // 子组件 改变的就是这段代码
  26. visible(val) {
  27. this.$emit("input",val);
  28. }
  29. },
  30. methods:{
  31. cancel(){
  32. this.visible = !this.visible;
  33. }
  34. },
  35. mounted() {
  36. if (this.value) {
  37. this.visible = true;
  38. }
  39. }
  40. }
  41. </script>

父组件代码如下:(父组件省去了 paretnVisibleChange 方法)

  1. <template>
  2. <div id="app">
  3. <HelloWorld v-mode = 'visible'/>
  4. </div>
  5. </template>
  6.  
  7. <script>
  8. import HelloWorld from './components/HelloWorld'
  9.  
  10. export default {
  11. name: 'App',
  12. components: {
  13. HelloWorld
  14. },
  15. data () {
  16. return {
  17. visible: true
  18. }
  19. }
  20. }
  21. </script>

方案三:

vue 2.3.0之后新增了 .sync 属性 使用方法跟 v-model  类似 具体 请参考 : https://cn.vuejs.org/v2/guide/components-custom-events.html#sync-修饰符

下面我写了一个简单的sync 的使用实例:

父组件的代码如下:

  1. <li
  2. is="DragCompent"
  3. v-for="(item, index) in layoutItem"
  4. :item="item"
  5. v-model="cloneLeftItemText"
  6. :leftDragItemIsDraged.sync = 'leftDragItemIsDraged'
  7. :key="index"></li>

子组件的代码如下:

  1. props: {
  2. leftDragItemIsDraged: {
  3. type: Boolean,
  4. default: false
  5. }
  6. },
  7. watch:{
  8. leftDragItemIsDraged(val) {
  9. this.thisLeftDragItemIsDraged = val;
  10. },
  11. thisLeftDragItemIsDraged(val){
  12. this.$emit('update:leftDragItemIsDraged', val)
  13. }
  14. }

效果如下:

Vue实现组件props双向绑定解决方案的更多相关文章

  1. 实现组件props双向绑定解决方案

    注意: 子组件不能直接修改prop过来的数据,会报错 方案一: 用data对象中创建一个props属性的副本 watch props属性 赋予data副本 来同步组件外对props的修改 watch ...

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

    Vue学习笔记-3 前言 Vue 2.x相比较Vue 1.x而言,升级变化除了实现了Virtual-Dom以外,给使用者最大不适就是移除的组件的props的双向绑定功能. 以往在Vue1.x中利用pr ...

  3. Vue父子组件数据双向绑定,子组件可修改props

    第一种,子组件通过监听父组件数据,子组件改变数据之后通知给父组件 原文链接:https://blog.csdn.net/m0_37728716/article/details/81776929 父组件 ...

  4. vue 自定义组件 v-model双向绑定、 父子组件同步通信

    父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa"  子组件使用$emit('update:msg', 'msg改变后的值xxx ...

  5. vue 自定义组件 v-model双向绑定、 父子组件同步通信【转】

    父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa"  子组件使用$emit('update:msg', 'msg改变后的值xxx ...

  6. vue 父子组件数据双向绑定

    父组件 <find-search v-model="searchshow"></find-search> 子组件 props: { value: { typ ...

  7. 7.vue组件(二)--双向绑定,父子组件访问

    本文主要说两件事 1. 如何实现父子组件之间的双向绑定 2. 父组件如何访问子组件的data,method, 子组件如何访问父组件的data,method等 一. 如何实现父子组件之间的双向绑定 案例 ...

  8. Vue2.0 Props双向绑定报错简易处理办法

    在写项目的时候遇到了一个报错问题,虽然功能是正常运行,chrome的提示是:[Vue warn]: Avoid mutating a prop directly since the value wil ...

  9. ionic3.x angular4.x ng4.x 自定义组件component双向绑定之自定义计数器

    本文主要示例在ionic3.x环境下实现一个自定义计数器,实现后最终效果如图: 1.使用命令创建一个component ionic g component CounterInput 类似的命令还有: ...

随机推荐

  1. service mysqld start 报错:service mysqld start 报错 090517 13:34:15 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 090Can't open the mysql.plugin table. Please run mysql

    service mysqld start 报错 090517 13:34:15 [ERROR] Can't open the mysql.plugin table. Please run mysql_ ...

  2. Kubernentes中的身份验证

    Kubernentes中的身份验证 kubernetes 系统的各组件需要使用 TLS 证书对通信进行加密,本文档使用 CloudFlare 的 PKI 工具集 cfssl 来生成 Certifica ...

  3. 为什么我不使用Kubernetes的Ingress

    为什么我不使用Kubernetes的Ingress 很不幸,据我所知Kubernetes的文档不是很完美,这就是为什么有很多同学在使用它的时候会遇到很多的坑,Ingress这个组件就是这些坑中的一个. ...

  4. docker 常用 命令

    http://os.51cto.com/art/201409/451117.htm 2.1 在测试机启动容器,安装ssh docker run -i -t ubuntu /bin/bash #此方式运 ...

  5. Struts2实现登录权限访问控制

    目录: Ⅰ 条件 Ⅱ 目的 Ⅲ 分析 Ⅳ 实现 Ⅴ 具体代码实现 ------------------------------------------------------------------- ...

  6. Vue表单和组件

    一.表单 v-model 指令在表单控件元素上创建双向数据绑定,v-model 会根据控件类型自动选取正确的方法来更新元素. <input v-model="message" ...

  7. ES6里关于字符串的拓展

    一.子串识别 自从 JS 引入了 indexOf() 方法,开发者们就使用它来识别字符串是否存在于其它字符串中.ES6 包含了以下三个方法来满足这类需求: 1.includes():该方法在给定文本存 ...

  8. ambari journalnode异常Can't scan a pre-transactional edit log

    今天在删日志文件,不知道删错哪个地方了. 该目录下一直报错,这个日志文件增长很快, /var/log/hadoop/hdfs/ hadoop-hdfs-journalnode-xx.log 先备份/h ...

  9. zabbix_sender高效模式

    1.zabbix_sender介绍 zabbix获取key值有超时时间,如果自定义的key脚本一般需要执行很长时间,这根本没法去做监控,获取数据有超时时间,如果一些数据需要执行比较长的时间才能获取的话 ...

  10. cocos2d-x ios游戏开发初认识(六) 渲染的优化

    做程序开发肯定要考虑到内存的优化,毕竟iphone本身的内存就不是非常大.这一节主要说这个cocos2d开发对内存的优化,详细表如今,既能够对同样的精灵(图片)仅仅渲染一次,也能够对不能的精灵仅仅渲染 ...