文章目录
1 注册组件的基本步骤
-
创建爱你组件构造器:Vue.extends()
-
注册组件:Vue.component()
-
使用组件
2 组件的基本使用
<div id="app">
<my-cpn></my-cpn>
<my-cpn></my-cpn>
<my-cpn></my-cpn>
</div>
<script src="../js/vue.js"></script>
<script>
const cpnConstructor = Vue.extend({
template: `
<div>
<h2>标题</h2>
<p>哈哈哈</p>
</div>
`
})
Vue.component('my-cpn', cpnConstructor)
const app = new Vue({
el: '#app',
data: {
message: "你好,有勇气的牛排"
}
})
</script>
3 全局组件和局部组件
<script src="../js/vue.js"></script>
<script>
const cpnC = Vue.extend({
template: `
<div>
<h2>标题</h2>
<p>内容</p>
</div>
`
})
const app = new Vue({
el: '#app',
data: {
message: "你好,有勇气的牛排"
},
components:{
cpn:cpnC
}
})
const app2 = new Vue({
el: '#app2'
})
</script>
4 父组件和子组件
<div id="app">
<cpn2></cpn2>
</div>
<script src="../js/vue.js"></script>
<script>
// 1 创建爱你第1个组件构造器(子组件)
const cpnC1 = Vue.extend({
template: `
<div>
<h2>标题1</h2>
<p>666</p>
</div>
`
})
// 2 创建爱你第2个组件构造器(父组件)
const cpnC2 = Vue.extend({
template: `
<div>
<h2>标题2</h2>
<p>777</p>
<cpn1></cpn1>
</div>
`,
components: {
cpn1: cpnC1
}
})
// root组件
const app = new Vue({
el: '#app',
data: {
message: "你好,有勇气的牛排"
},
components: {
cpn2: cpnC2
}
})
</script>
5 注册组件语法糖
主要省区了调用Vue.extend()的步骤,而是可以直接使用一个对象来代替
<script>
Vue.component('cpn1', {
template: `
<div>
<h2>标题1</h2>
<p>666</p>
</div>
`
})
const app = new Vue({
el: '#app',
data: {
message: "你好,有勇气的牛排"
},
components: {
'cpn2': {
template: `
<div>
<h2>标题2</h2>
<p>777</p>
</div>
`
}
}
})
</script>
6 组件模板分离写法 组件数据存放
存放
<div id="app">
<cpn1></cpn1>
<cpn2></cpn2>
</div>
<script type="text/x-template" id="cpn1">
<div>
<h2>标题1</h2>
<p>666</p>
</div>
</script>
<template id="cpn2">
<div>
<h2>标题2</h2>
<p>777</p>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
Vue.component('cpn1', {
template: '#cpn1'
})
Vue.component('cpn2', {
template: '#cpn2'
})
const app = new Vue({
el: '#app',
data: {
message: "你好,有勇气的牛排"
}
})
</script>
7 组件中data为什么是函数
<div id="app">
<cpn></cpn>
<cpn></cpn>
<cpn></cpn>
</div>
<template id="cpn">
<div>
<h2>当前计数:{{ counter }}</h2>
<button @click="increment">+</button>
<button @click="decrement">-</button>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
Vue.component('cpn', {
template: '#cpn',
data() {
return {
counter: 0
}
},
methods: {
increment() {
this.counter++;
},
decrement() {
this.counter--;
}
}
})
const app = new Vue({
el: '#app',
data: {
message: "你好,有勇气的牛排"
}
})
</script>
8 父子组件的通信
-
通过props想自键传递数据
-
通过时间向父组件发送消息
props数据验证
支持:String、Number、Boolean、Array、Object、Date、Function、Symbol
<div id="app">
<cpn v-bind:cmovies="movies"></cpn>
</div>
<template id="cpn">
<div>
<h2>{{ cmessage }}</h2>
<ul>
<li v-for="item in cmovies">{{ item }}</li>
</ul>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const cpn = {
template: '#cpn',
props: {
cmessage: {
type: String,
default: '666',
required: true
},
cmoves: {
type: Array,
default() {
return []
}
}
},
data() {
return {}
},
methods: {}
}
const app = new Vue({
el: '#app',
data: {
message: "你好,有勇气的牛排",
movies: ['三体', '金刚狼', '疯狂外星人']
},
components: {
cpn
}
})
</script>
9 父子通信-父传子(props中的驼峰命名)
<div id="app">
<cpn :c-info="info" :child-my-message="message"></cpn>
</div>
<template id="cpn">
<h2>{{ cInfo }}</h2>
</template>
<script src="../js/vue.js"></script>
<script>
const cpn = {
template: '#cpn',
props: {
cInfo: {
type: Object,
default() {
return {}
}
},
childMyMessage: {
type: String,
default: ''
}
}
}
const app = new Vue({
el: '#app',
data: {
info: {
name: "有勇气的牛排",
age: 18,
sex: 0
}
},
components: {
cpn
}
})
</script>
10 组件通信-子传父(自定义事件)
什么时候需要使用自定义事件?
自定义事件的流程
-
在子组件中,通过$emit()来触发事件。
-
在父组件中,通过v-on来鉴定子组件事件
<template id="cpn">
<div>
<button v-for="item in categories"
@click="btnClick(item)">
{{ item.name }}
</button>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const cpn = {
template: '#cpn',
data() {
return {
categories: [
{id: '1', name: '热门推荐'},
{id: '2', name: '手机数码'},
{id: '3', name: '家电'},
{id: '4', name: '电脑办公'},
{id: '5', name: '衣服'},
{id: '6', name: '玩具'}
]
}
},
methods: {
btnClick(item) {
this.$emit('item-click', item)
}
}
}
const app = new Vue({
el: '#app',
data: {
message: '有勇气的牛排'
},
components: {
cpn
},
methods: {
cpnclick(item) {
console.log('cpnclick', item);
}
}
})
</script>
11 12 组件通信 案例
见gitee源代码
13 父子组件的访问方式:$children
有时候我们需要父组件直接访问子组件,子组件直接访问父组件,或者是组件访问跟组件。
<div id="app">
<cpn></cpn>
<cpn ref="key1"></cpn>
<cpn></cpn>
<button @click="btnClick">按钮</button>
</div>
<template id="cpn">
<div>我是子组件</div>
</template>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: "你好,有勇气的牛排"
},
methods: {
btnClick() {
console.log(this.$refs.key1.name);
}
},
components: {
cpn: {
template: '#cpn',
data() {
return {
name: '我是子组件的name'
}
},
methods: {
showMessage() {
console.log('showMessage');
}
}
}
}
})
</script>
<p><h3>文章目录</h3><ul><ul><li><a href="#1__1">1 注册组件的基本步骤</a></li><li><a href="#2__9">2 组件的基本使用</a></li><li><a href="#3__43">3 全局组件和局部组件</a></li><li><a href="#4__79">4 父组件和子组件</a></li><li><a href="#5__125">5 注册组件语法糖</a></li><li><a href="#6___162">6 组件模板分离写法 组件数据存放</a></li><li><a href="#7_data_214">7 组件中data为什么是函数</a></li><li><a href="#8__261">8 父子组件的通信</a></li><li><a href="#9_props_331">9 父子通信-父传子(props中的驼峰命名)</a></li><li><a href="#10__375">10 组件通信-子传父(自定义事件)</a></li><li><a href="#11_12___445">11 12 组件通信 案例</a></li><li><a href="#13_children_449">13 父子组件的访问方式:$children</a></li></ul></ul></p>
<h2><a id="1__1"></a>1 注册组件的基本步骤</h2>
<ul>
<li>
<p>创建爱你组件构造器:<code>Vue.extends()</code></p>
</li>
<li>
<p>注册组件:<code>Vue.component()</code></p>
</li>
<li>
<p>使用组件</p>
</li>
</ul>
<h2><a id="2__9"></a>2 组件的基本使用</h2>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"app"</span>></span>
<span class="hljs-comment"><!-- 3 使用组件 --></span>
<span class="hljs-tag"><<span class="hljs-name">my-cpn</span>></span><span class="hljs-tag"></<span class="hljs-name">my-cpn</span>></span>
<span class="hljs-tag"><<span class="hljs-name">my-cpn</span>></span><span class="hljs-tag"></<span class="hljs-name">my-cpn</span>></span>
<span class="hljs-tag"><<span class="hljs-name">my-cpn</span>></span><span class="hljs-tag"></<span class="hljs-name">my-cpn</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"../js/vue.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript">
<span class="hljs-comment">// 1 创建组件构造器对象</span>
<span class="hljs-keyword">const</span> cpnConstructor = <span class="hljs-title class_">Vue</span>.<span class="hljs-title function_">extend</span>({
<span class="hljs-attr">template</span>: <span class="hljs-string">`
<div>
<h2>标题</h2>
<p>哈哈哈</p>
</div>
`</span>
})
<span class="hljs-comment">// 2 注册组件</span>
<span class="hljs-title class_">Vue</span>.<span class="hljs-title function_">component</span>(<span class="hljs-string">'my-cpn'</span>, cpnConstructor)
<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Vue</span>({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,
<span class="hljs-attr">data</span>: {
<span class="hljs-attr">message</span>: <span class="hljs-string">"你好,有勇气的牛排"</span>
}
})
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
</code></div></pre>
<h2><a id="3__43"></a>3 全局组件和局部组件</h2>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"../js/vue.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript">
<span class="hljs-comment">// 1 创建组件构造器</span>
<span class="hljs-keyword">const</span> cpnC = <span class="hljs-title class_">Vue</span>.<span class="hljs-title function_">extend</span>({
<span class="hljs-attr">template</span>: <span class="hljs-string">`
<div>
<h2>标题</h2>
<p>内容</p>
</div>
`</span>
})
<span class="hljs-comment">// 2 组件注册(全局组件: 意味着可以在多个Vue实例下面使用)</span>
<span class="hljs-comment">// Vue.component('cpn', cpnC)</span>
<span class="hljs-comment">// Vue实例1</span>
<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Vue</span>({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,
<span class="hljs-attr">data</span>: {
<span class="hljs-attr">message</span>: <span class="hljs-string">"你好,有勇气的牛排"</span>
},
<span class="hljs-comment">// 局部组件</span>
<span class="hljs-attr">components</span>:{
<span class="hljs-comment">// cpn使用组件时的标签名</span>
<span class="hljs-attr">cpn</span>:cpnC
}
})
<span class="hljs-comment">// Vue实例2</span>
<span class="hljs-keyword">const</span> app2 = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Vue</span>({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app2'</span>
})
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
</code></div></pre>
<h2><a id="4__79"></a>4 父组件和子组件</h2>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"app"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cpn2</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn2</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"../js/vue.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-xml">
// 1 创建爱你第1个组件构造器(子组件)
const cpnC1 = Vue.extend({
template: `
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">h2</span>></span>标题1<span class="hljs-tag"></<span class="hljs-name">h2</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>666<span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
`
})
// 2 创建爱你第2个组件构造器(父组件)
const cpnC2 = Vue.extend({
template: `
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">h2</span>></span>标题2<span class="hljs-tag"></<span class="hljs-name">h2</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>777<span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cpn1</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn1</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
`,
components: {
cpn1: cpnC1
}
})
// root组件
const app = new Vue({
el: '#app',
data: {
message: "你好,有勇气的牛排"
},
components: {
cpn2: cpnC2
}
})
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
</code></div></pre>
<h2><a id="5__125"></a>5 注册组件语法糖</h2>
<p>主要省区了调用Vue.extend()的步骤,而是可以直接使用一个对象来代替</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript">
<span class="hljs-comment">// 1 全局组件注册的语法糖</span>
<span class="hljs-comment">// 1 创建组件构造器</span>
<span class="hljs-comment">// const cpn1 = Vue.extend()</span>
<span class="hljs-comment">// 2 组件注册(全局方式)</span>
<span class="hljs-title class_">Vue</span>.<span class="hljs-title function_">component</span>(<span class="hljs-string">'cpn1'</span>, {
<span class="hljs-attr">template</span>: <span class="hljs-string">`
<div>
<h2>标题1</h2>
<p>666</p>
</div>
`</span>
})
<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Vue</span>({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,
<span class="hljs-attr">data</span>: {
<span class="hljs-attr">message</span>: <span class="hljs-string">"你好,有勇气的牛排"</span>
},
<span class="hljs-attr">components</span>: {
<span class="hljs-string">'cpn2'</span>: {
<span class="hljs-attr">template</span>: <span class="hljs-string">`
<div>
<h2>标题2</h2>
<p>777</p>
</div>
`</span>
}
}
})
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
</code></div></pre>
<h2><a id="6___162"></a>6 组件模板分离写法 组件数据存放</h2>
<p>存放</p>
<ul>
<li>
<p>组件对象向也有一个data属性(也可以有methods等属性)</p>
</li>
<li>
<p>只是这个data属性必须是一个函数</p>
</li>
<li>
<p>而且这个函数返回一个对象,对象内部保存着数据</p>
</li>
</ul>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"app"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cpn1</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn1</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cpn2</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn2</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-comment"><!-- 1 script标签,注意:类型必须是text/x-template --></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/x-template"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"cpn1"</span>></span><span class="language-xml">
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">h2</span>></span>标题1<span class="hljs-tag"></<span class="hljs-name">h2</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>666<span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-comment"><!-- 2 template标签 --></span>
<span class="hljs-tag"><<span class="hljs-name">template</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"cpn2"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">h2</span>></span>标题2<span class="hljs-tag"></<span class="hljs-name">h2</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>777<span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">template</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"../js/vue.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript">
<span class="hljs-comment">// 注册一个全局组件</span>
<span class="hljs-title class_">Vue</span>.<span class="hljs-title function_">component</span>(<span class="hljs-string">'cpn1'</span>, {
<span class="hljs-attr">template</span>: <span class="hljs-string">'#cpn1'</span>
})
<span class="hljs-title class_">Vue</span>.<span class="hljs-title function_">component</span>(<span class="hljs-string">'cpn2'</span>, {
<span class="hljs-attr">template</span>: <span class="hljs-string">'#cpn2'</span>
})
<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Vue</span>({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,
<span class="hljs-attr">data</span>: {
<span class="hljs-attr">message</span>: <span class="hljs-string">"你好,有勇气的牛排"</span>
}
})
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
</code></div></pre>
<h2><a id="7_data_214"></a>7 组件中data为什么是函数</h2>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"app"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cpn</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cpn</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cpn</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-comment"><!-- 组件实例对象 --></span>
<span class="hljs-tag"><<span class="hljs-name">template</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"cpn"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">h2</span>></span>当前计数:{{ counter }}<span class="hljs-tag"></<span class="hljs-name">h2</span>></span>
<span class="hljs-tag"><<span class="hljs-name">button</span> @<span class="hljs-attr">click</span>=<span class="hljs-string">"increment"</span>></span>+<span class="hljs-tag"></<span class="hljs-name">button</span>></span>
<span class="hljs-tag"><<span class="hljs-name">button</span> @<span class="hljs-attr">click</span>=<span class="hljs-string">"decrement"</span>></span>-<span class="hljs-tag"></<span class="hljs-name">button</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">template</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"../js/vue.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript">
<span class="hljs-comment">// 1 注册组件</span>
<span class="hljs-title class_">Vue</span>.<span class="hljs-title function_">component</span>(<span class="hljs-string">'cpn'</span>, {
<span class="hljs-attr">template</span>: <span class="hljs-string">'#cpn'</span>,
<span class="hljs-title function_">data</span>(<span class="hljs-params"></span>) {
<span class="hljs-keyword">return</span> {
<span class="hljs-attr">counter</span>: <span class="hljs-number">0</span>
}
},
<span class="hljs-attr">methods</span>: {
<span class="hljs-title function_">increment</span>(<span class="hljs-params"></span>) {
<span class="hljs-variable language_">this</span>.<span class="hljs-property">counter</span>++;
},
<span class="hljs-title function_">decrement</span>(<span class="hljs-params"></span>) {
<span class="hljs-variable language_">this</span>.<span class="hljs-property">counter</span>--;
}
}
})
<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Vue</span>({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,
<span class="hljs-attr">data</span>: {
<span class="hljs-attr">message</span>: <span class="hljs-string">"你好,有勇气的牛排"</span>
}
})
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
</code></div></pre>
<h2><a id="8__261"></a>8 父子组件的通信</h2>
<ul>
<li>
<p>通过props想自键传递数据</p>
</li>
<li>
<p>通过时间向父组件发送消息</p>
</li>
</ul>
<p>props数据验证</p>
<p>支持:String、Number、Boolean、Array、Object、Date、Function、Symbol</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"app"</span>></span>
<span class="hljs-comment"><!-- <cpn v-bind:cmovies="movies" :cmessage="message"></cpn>--></span>
<span class="hljs-tag"><<span class="hljs-name">cpn</span> <span class="hljs-attr">v-bind:cmovies</span>=<span class="hljs-string">"movies"</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">template</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"cpn"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">h2</span>></span>{{ cmessage }}<span class="hljs-tag"></<span class="hljs-name">h2</span>></span>
<span class="hljs-tag"><<span class="hljs-name">ul</span>></span>
<span class="hljs-tag"><<span class="hljs-name">li</span> <span class="hljs-attr">v-for</span>=<span class="hljs-string">"item in cmovies"</span>></span>{{ item }}<span class="hljs-tag"></<span class="hljs-name">li</span>></span>
<span class="hljs-tag"></<span class="hljs-name">ul</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">template</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"../js/vue.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript">
<span class="hljs-comment">// 父传子:props</span>
<span class="hljs-keyword">const</span> cpn = {
<span class="hljs-attr">template</span>: <span class="hljs-string">'#cpn'</span>,
<span class="hljs-comment">// props: ['cmovies', 'cmessage'],</span>
<span class="hljs-attr">props</span>: {
<span class="hljs-comment">// 1 类型限制</span>
<span class="hljs-comment">// cmovies:Array,</span>
<span class="hljs-comment">// cmessage:String</span>
<span class="hljs-comment">// 2 提供一些默认值</span>
<span class="hljs-attr">cmessage</span>: {
<span class="hljs-attr">type</span>: <span class="hljs-title class_">String</span>,
<span class="hljs-attr">default</span>: <span class="hljs-string">'666'</span>,
<span class="hljs-attr">required</span>: <span class="hljs-literal">true</span>
},
<span class="hljs-comment">// 类型是对象或者数组时,默认值必须是一个函数</span>
<span class="hljs-attr">cmoves</span>: {
<span class="hljs-attr">type</span>: <span class="hljs-title class_">Array</span>,
<span class="hljs-title function_">default</span>(<span class="hljs-params"></span>) {
<span class="hljs-keyword">return</span> []
}
}
},
<span class="hljs-title function_">data</span>(<span class="hljs-params"></span>) {
<span class="hljs-keyword">return</span> {}
},
<span class="hljs-attr">methods</span>: {}
}
<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Vue</span>({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,
<span class="hljs-attr">data</span>: {
<span class="hljs-attr">message</span>: <span class="hljs-string">"你好,有勇气的牛排"</span>,
<span class="hljs-attr">movies</span>: [<span class="hljs-string">'三体'</span>, <span class="hljs-string">'金刚狼'</span>, <span class="hljs-string">'疯狂外星人'</span>]
},
<span class="hljs-attr">components</span>: {
cpn
}
})
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
</code></div></pre>
<h2><a id="9_props_331"></a>9 父子通信-父传子(props中的驼峰命名)</h2>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"app"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cpn</span> <span class="hljs-attr">:c-info</span>=<span class="hljs-string">"info"</span> <span class="hljs-attr">:child-my-message</span>=<span class="hljs-string">"message"</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">template</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"cpn"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">h2</span>></span>{{ cInfo }}<span class="hljs-tag"></<span class="hljs-name">h2</span>></span>
<span class="hljs-tag"></<span class="hljs-name">template</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"../js/vue.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript">
<span class="hljs-keyword">const</span> cpn = {
<span class="hljs-attr">template</span>: <span class="hljs-string">'#cpn'</span>,
<span class="hljs-attr">props</span>: {
<span class="hljs-attr">cInfo</span>: {
<span class="hljs-attr">type</span>: <span class="hljs-title class_">Object</span>,
<span class="hljs-title function_">default</span>(<span class="hljs-params"></span>) {
<span class="hljs-keyword">return</span> {}
}
},
<span class="hljs-attr">childMyMessage</span>: {
<span class="hljs-attr">type</span>: <span class="hljs-title class_">String</span>,
<span class="hljs-attr">default</span>: <span class="hljs-string">''</span>
}
}
}
<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Vue</span>({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,
<span class="hljs-attr">data</span>: {
<span class="hljs-attr">info</span>: {
<span class="hljs-attr">name</span>: <span class="hljs-string">"有勇气的牛排"</span>,
<span class="hljs-attr">age</span>: <span class="hljs-number">18</span>,
<span class="hljs-attr">sex</span>: <span class="hljs-number">0</span>
}
},
<span class="hljs-attr">components</span>: {
cpn
}
})
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
</code></div></pre>
<h2><a id="10__375"></a>10 组件通信-子传父(自定义事件)</h2>
<p>什么时候需要使用自定义事件?</p>
<ul>
<li>
<p>当子组件需要想父组件传递数据时,就要用到自定义事件了</p>
</li>
<li>
<p>v-on不仅仅可以用于监听DOM事件,也可以用于组件间的自定义事件</p>
</li>
</ul>
<p>自定义事件的流程</p>
<ul>
<li>
<p>在子组件中,通过$emit()来触发事件。</p>
</li>
<li>
<p>在父组件中,通过v-on来鉴定子组件事件</p>
</li>
</ul>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-comment"><!-- 子组件模板 --></span>
<span class="hljs-tag"><<span class="hljs-name">template</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"cpn"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">button</span> <span class="hljs-attr">v-for</span>=<span class="hljs-string">"item in categories"</span>
@<span class="hljs-attr">click</span>=<span class="hljs-string">"btnClick(item)"</span>></span>
{{ item.name }}
<span class="hljs-tag"></<span class="hljs-name">button</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">template</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"../js/vue.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript">
<span class="hljs-comment">// 1 子组件</span>
<span class="hljs-keyword">const</span> cpn = {
<span class="hljs-attr">template</span>: <span class="hljs-string">'#cpn'</span>,
<span class="hljs-title function_">data</span>(<span class="hljs-params"></span>) {
<span class="hljs-keyword">return</span> {
<span class="hljs-attr">categories</span>: [
{<span class="hljs-attr">id</span>: <span class="hljs-string">'1'</span>, <span class="hljs-attr">name</span>: <span class="hljs-string">'热门推荐'</span>},
{<span class="hljs-attr">id</span>: <span class="hljs-string">'2'</span>, <span class="hljs-attr">name</span>: <span class="hljs-string">'手机数码'</span>},
{<span class="hljs-attr">id</span>: <span class="hljs-string">'3'</span>, <span class="hljs-attr">name</span>: <span class="hljs-string">'家电'</span>},
{<span class="hljs-attr">id</span>: <span class="hljs-string">'4'</span>, <span class="hljs-attr">name</span>: <span class="hljs-string">'电脑办公'</span>},
{<span class="hljs-attr">id</span>: <span class="hljs-string">'5'</span>, <span class="hljs-attr">name</span>: <span class="hljs-string">'衣服'</span>},
{<span class="hljs-attr">id</span>: <span class="hljs-string">'6'</span>, <span class="hljs-attr">name</span>: <span class="hljs-string">'玩具'</span>}
]
}
},
<span class="hljs-attr">methods</span>: {
<span class="hljs-title function_">btnClick</span>(<span class="hljs-params">item</span>) {
<span class="hljs-comment">// console.log(item)</span>
<span class="hljs-comment">// 发射事件: 自定义事件</span>
<span class="hljs-variable language_">this</span>.$emit(<span class="hljs-string">'item-click'</span>, item)
}
}
}
<span class="hljs-comment">// 2 父组件</span>
<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Vue</span>({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,
<span class="hljs-attr">data</span>: {
<span class="hljs-attr">message</span>: <span class="hljs-string">'有勇气的牛排'</span>
},
<span class="hljs-attr">components</span>: {
cpn
},
<span class="hljs-attr">methods</span>: {
<span class="hljs-title function_">cpnclick</span>(<span class="hljs-params">item</span>) {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'cpnclick'</span>, item);
}
}
})
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
</code></div></pre>
<h2><a id="11_12___445"></a>11 12 组件通信 案例</h2>
<p>见gitee源代码</p>
<h2><a id="13_children_449"></a>13 父子组件的访问方式:$children</h2>
<p>有时候我们需要父组件直接访问子组件,子组件直接访问父组件,或者是组件访问跟组件。</p>
<ul>
<li>
<p>父组件访问子组件:使用children或者refs(reference 引用)</p>
</li>
<li>
<p>子组件访问父组件:$parent</p>
</li>
</ul>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"app"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cpn</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cpn</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"key1"</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cpn</span>></span><span class="hljs-tag"></<span class="hljs-name">cpn</span>></span>
<span class="hljs-tag"><<span class="hljs-name">button</span> @<span class="hljs-attr">click</span>=<span class="hljs-string">"btnClick"</span>></span>按钮<span class="hljs-tag"></<span class="hljs-name">button</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">template</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"cpn"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span>></span>我是子组件<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">template</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"../js/vue.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript">
<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Vue</span>({
<span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,
<span class="hljs-attr">data</span>: {
<span class="hljs-attr">message</span>: <span class="hljs-string">"你好,有勇气的牛排"</span>
},
<span class="hljs-attr">methods</span>: {
<span class="hljs-title function_">btnClick</span>(<span class="hljs-params"></span>) {
<span class="hljs-comment">// 1 $children</span>
<span class="hljs-comment">// console.log(this.$children);</span>
<span class="hljs-comment">// this.$children[0].showMessage();</span>
<span class="hljs-comment">// this.$children[0].name;</span>
<span class="hljs-comment">// for(let c of this.$children){</span>
<span class="hljs-comment">// c.showMessage();</span>
<span class="hljs-comment">// }</span>
<span class="hljs-comment">// 2 $refs => 对象类型,默认是一个空对象 ref='key1'</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-variable language_">this</span>.<span class="hljs-property">$refs</span>.<span class="hljs-property">key1</span>.<span class="hljs-property">name</span>);
}
},
<span class="hljs-attr">components</span>: {
<span class="hljs-attr">cpn</span>: {
<span class="hljs-attr">template</span>: <span class="hljs-string">'#cpn'</span>,
<span class="hljs-title function_">data</span>(<span class="hljs-params"></span>) {
<span class="hljs-keyword">return</span> {
<span class="hljs-attr">name</span>: <span class="hljs-string">'我是子组件的name'</span>
}
},
<span class="hljs-attr">methods</span>: {
<span class="hljs-title function_">showMessage</span>(<span class="hljs-params"></span>) {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'showMessage'</span>);
}
}
}
}
})
</span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
</code></div></pre>
留言