「Vue.jsコンポーネントの概要」の基本概念
8688 ワード
//
<span class="hljs-keyword">function</span> oneOf (value, validList) {
<span class="hljs-keyword">for</span> (<span class="hljs-built_in">let</span> i = 0; i < validList.length; i++) {
<span class="hljs-keyword">if</span> (value === validList[i]) {
<span class="hljs-built_in">return</span> <span class="hljs-literal">true</span>;
}
}
<span class="hljs-built_in">return</span> <span class="hljs-literal">false</span>;
}
<span class="hljs-built_in">export</span> default {
props: {
size: {
validator (value) {
<span class="hljs-built_in">return</span> oneOf(value, [<span class="hljs-string">'small'</span>, <span class="hljs-string">'large'</span>, <span class="hljs-string">'default'</span>]);
},
default: <span class="hljs-string">'default'</span>
},
disabled: {
<span class="hljs-built_in">type</span>: Boolean,
default: <span class="hljs-literal">false</span>
}
}
}
$parent
$children
を使用して親/子コンポーネントprovide
inject
世代非応答式取得データ、方法// A.vue
export default {
provide: {
name: 'Aresn'
}
}
// B.vue
export default {
inject: ['name'],
mounted () {
console.log(this.name); // Aresn
}
}
broadcast
およびdispatch
が、上下の送信イベントfunction broadcast(componentName, eventName, params) {
this.$children.forEach(child => {
const name = child.$options.name;
if (name === componentName) {
child.$emit.apply(child, [eventName].concat(params));
} else {
broadcast.apply(child, [componentName, eventName].concat([params]));
}
});
}
export default {
methods: {
dispatch(componentName, eventName, params) {
let parent = this.$parent || this.$root;
let name = parent.$options.name;
while (parent && (!name || name !== componentName)) {
parent = parent.$parent;
if (parent) {
name = parent.$options.name;
}
}
if (parent) {
parent.$emit.apply(parent, [eventName].concat(params));
}
},
broadcast(componentName, eventName, params) {
broadcast.call(this, componentName, eventName, params);
}
}
};
// ,
function findComponentUpward(context, componentName) {
let parent = context.$parent;
let name = parent.$options.name;
while (parent && (!name || [componentName].indexOf(name) < 0)) {
parent = parent.$parent;
if (parent) name = parent.$options.name;
}
return parent;
}
// ,
function findComponentsUpward(context, componentName) {
const parents = [];
const parent = context.$parent;
if (parent) {
if (parent.$options.name === componentName) parents.push(parent);
return parents.concat(findComponentsUpward(parent, componentName));
}
return [];
}
// ,
function findComponentDownward(context, componentName) {
const childrens = context.$children;
let children = null;
if (childrens.length) {
for (const child of childrens) {
const name = child.$options.name;
if (name === componentName) {
children = child;
break;
} else {
children = findComponentDownward(child, componentName);
if (children) break;
}
}
}
return children;
}
// ,
function findComponentsDownward(context, componentName) {
return context.$children.reduce((components, child) => {
if (child.$options.name === componentName) components.push(child);
const foundChilds = findComponentsDownward(child, componentName);
return components.concat(foundChilds);
}, []);
}
// ,
function findBrothersComponents(context, componentName, exceptMe = true) {
const res = context.$parent.$children.filter(item => item.$options.name === componentName);
const index = res.findIndex(item => item._uid === context._uid);
if (exceptMe) res.splice(index, 1);
return res;
}
$mount
コンポーネントをレンダリングするために使用され、$el
にアクセスできますが、ページに直接マウントされることはありません.functional
のブール値オプションを提供し、trueに設定すると、コンポーネントのステータスなしおよびインスタンスなし、すなわちdataおよびthisコンテキストなしにすることができます.slot-scope
の使用コンポーネント:
- "book in books" :key="book.id">
"book">
{{ book.name }}
次の操作を行います.
"books">
"{ book }">
"book.sale">
{{ book.name }}
およびis
は、コンポーネントの動的切り替え"component">
keep-alive
さらにいくつかの追加のpropsを構成することができます:this.$emit('update:value', this.value + val);
親アセンブリ: