javascript - Vuejs 自动将所有 Prop 传递给 child

标签 javascript html vue.js vuejs2

当我以这种方式将所有 Prop 传给 child 时

v-bind="$props"

父级传递所有 Prop ,但子级不过滤它,如果不识别子级在我们的 html 中打印的 Prop 。 结果是一个脏的和无效的 html :(

	Vue.component('cc', {
		template: `
			<div>here is cc
				{{y}}
			</div>
		`,
		props: ['y']
	});	
  Vue.component('bb', {
		template: `
			<div>here is bb
				{{x}}
			</div>
		`,
		props: ['x']
	});

	Vue.component('aa', {
		template: `
			<div>here is aa
				<bb v-bind="$props" :x="'1'"/>
        <cc v-bind="$props" />
			</div>
		`,
		props: ['x', 'y']
	})
	var a = new Vue({
		template: `
		<div>
			<aa :x="x" :y="1"/>
		</div>
		`,
		data(){
			return {
				x: 0
			};
		}
	});
	a.$mount('#app');
<script src="https://unpkg.com/vue"></script>

<div id="app">
</div>

正如你在这个例子中看到的,组件 bb 有这个 HTML

<div y="1">here is bb 1</div>

组件cc有

<div x="0">here is cc 1</div>

当我有很多 Prop 时,这是一个大问题

我知道我可以解决它只传递组件需要的 Prop ,但是对于一个大型应用程序,我需要搜索我的所有组件并在每次需要添加它时添加一个新 Prop 。太有问题了... 在以前的版本 (2.1.10) 中,它工作得很好!

最佳答案

简化 props 规范会降低代码的清晰度,因此您应该避免这样做。子 Prop 名称与父 Prop 名称匹配的情况表明您应该使用 event bus。或者(如评论者所建议的那样)Vuex 数据存储。

然而,可以内省(introspection)组件 props,因此只绑定(bind)组件需要的 props。

function propsFor(componentName, propSource) {
  const P = Vue.component(componentName).prototype;
  const propNames = Object.keys(P);
  // More expensively, but more correctly:
  // propNames = Object.keys(new (Vue.component(componentName))().$props);
  const result = {};

  for (const n of propNames) {
    result[n] = propSource[n];
  }
  return result;
}

Vue.component('cc', {
  template: `
			<div>here is cc
				{{y}}
			</div>
		`,
  props: ['y']
});
Vue.component('bb', {
  template: `
			<div>here is bb
				{{x}}
			</div>
		`,
  props: ['x']
});

Vue.component('aa', {
  template: `
			<div>here is aa
				<bb v-bind="propsFor('bb', $props)" :x="'1'"/>
        <cc v-bind="propsFor('cc', $props)" />
			</div>
		`,
  props: ['x', 'y']
})
var a = new Vue({
  template: `
		<div>
			<aa :x="x" :y="1"/>
		</div>
		`,
  data() {
    return {
      x: 0
    };
  }
});
a.$mount('#app');
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.3.2/vue.min.js"></script>
<div id="app">
</div>

关于javascript - Vuejs 自动将所有 Prop 传递给 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43778076/

相关文章:

javascript - 如何将自动缩进添加到 HTML 文本区域?

javascript - 将多个 Canvas 合并到一个 div 中并将它们全部组合到一个 Canvas 中

html - 我无法在两个 div 中间创建一个分区,我的页脚也没有粘在底部

javascript - 使用 Vue.js 更改 CSS 类属性

javascript - Heroku "Process exited with status 137"node.js 应用程序

javascript - 从多个 <select>/<option> 获取值时出现问题

html - 选择和输入的文本颜色

javascript - 如何在 Vue 中加载 YAML 文件?

javascript - 在本地和沙盒外部署 Vue 应用程序

javascript - AudioContext:振荡器 - 了解所有声音何时播放