javascript - 将对象的属性作为 props Vuejs 传递

标签 javascript vue.js vuejs2

大家好, 我有些困惑。我有两个组件(子组件和父组件),我将对象的属性作为 Prop 传递

<child :child-data="abc" ></child>
Vue.component('childComponent', {
props: ['childData'],
 data: function(){
    return {
        count:this.childData,// recommend use Vue.util.extend
    }
 },
});

Vue 会递归地将 childComponent 的“数据”属性转换为 getter/setter 以使其“响应式”。 那么为什么它不自动绑定(bind)数据到模板呢?我读了一些建议使用 Vue.util.extend。为什么选择 Vue.util.extend?

更新

我的例子: https://jsfiddle.net/hoanghung1995/xncs5qpd/56/

当我设置 parentData 的默认值时,childDataA 将显示它。但是当我使用 v-model 覆盖 parentData 时,childDataA 不是“ react 性的”。我必须使用 "watch"来覆盖 "data",类似于 childDataB

Vue.util.extend 示例:https://jsfiddle.net/sm4kx7p9/3/

为什么 Vue.util.extend 可以正常工作但不能使用“watch”?,

最佳答案

要解释后台实际发生的情况,Linus Borg has as excellent answer for your question .总结一下他的回答,您的方法不起作用的原因是 data 是一个计算属性,而 props 是作为原始类型传入的。换句话说,data 制作了您的 props 的副本(而不是通过引用传递)。

绕过这个的另一种方法是将您的 childData 声明为计算属性而不是数据,即:

computed: {
    childDataA() {
        return this.childPropsA;
    },
    childDataB() {
        return this.childPropsB;
    }
}

使用 computed 的原因是因为计算属性现在会监视其依赖项的变化。

基于您的原始 fiddle 的概念验证示例:

Vue.component('child', {
  props: ['childPropsA', 'childPropsB'],
  template: "#sub",
  computed: {
    childDataA() {
      return this.childPropsA;
    },
    childDataB() {
      return this.childPropsB;
    }
  }
});
new Vue({
  el: '#app',
  data: {
    parentData: '123'
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
  parentData:{{parentData}}<br>
  <input type="text" v-model="parentData">
  <child :child-props-a="parentData" :child-props-b="parentData"></child>
</div>
<template id="sub">
  <div>
    <p> 1- {{ childDataA }}</p> 
    <p> 2- {{ childDataB }}</p> 
    </div>
</template>

上面的方法在功能上与 data + watch 方法相同,但我发现它相当麻烦并且给你的代码增加了不必要的冗长:

data: function() {
    return {
      childDataA: this.childPropsA,
      childDataB: this.childPropsB
    };
  },
  watch: {
    childPropsA() {
      this.childDataA = this.childPropsA;
    },
    childPropsB() {
      this.childDataB = this.childPropsB;
    }
  }

Vue.component('child', {
  props: ['childPropsA', 'childPropsB'],
  template: "#sub",
  data: function() {
    return {
      childDataA: this.childPropsA,
      childDataB: this.childPropsB
    };
  },
  watch: {
    childPropsA() {
      this.childDataA = this.childPropsA;
    },
    childPropsB() {
      this.childDataB = this.childPropsB;
    }
  }
});
new Vue({
  el: '#app',
  data: {
    parentData: '123'
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
  parentData:{{parentData}}<br>
  <input type="text" v-model="parentData">
  <child :child-props-a="parentData" :child-props-b="parentData"></child>
</div>
<template id="sub">
  <div>
    <p> 1- {{ childDataA }}</p> 
    <p> 2- {{ childDataB }}</p> 
    </div>
</template>

关于javascript - 将对象的属性作为 props Vuejs 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51054344/

相关文章:

vue.js - v-model 和 selected 不能同时工作... --vue.js

vue.js - 为什么我的 Vuex getter 在客户端返回 TRUE 而在服务器端返回 FALSE?

javascript - 下面两种代码风格有什么区别

javascript - 当它点击iframe内的图片时,弹出窗口可以在iframe外显示吗?

javascript - 使用 Axios 取消之前的 API 请求

javascript - Vue2 & $refs & 无法读取未定义的属性 'msg'

javascript - Bootstrap Codeigniter 3 表单点击编辑

javascript - 如何通过搜索 "name"/key 获得 "value"?

typescript - 在没有 webpack 的情况下使用 VueJs 和 Typescript

vue.js - 为动态生成的 nuxt 页面选择布局