一、父子组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="first">
<father_component></father_component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let childConstructor = Vue.extend({
template: `
<div>
<h2>我是子组件</h2>
</div>`,
})
let fatherConstructor = Vue.extend({
template: `
<div>
<h2>我是父组件</h2>
<child_component></child_component>
</div>`,
components:{
child_component: childConstructor
}
})
let app = new Vue({
el: '#first',
data:{
},
components:{
father_component: fatherConstructor,
}
})
</script>
</body>
</html>
二、父子组件通信
1. 父传子
1.1 直接数据不能传
- 子组件的模板中,不能获取父组件或者Vue实例中的数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父子组件</title>
</head>
<body>
<div id="first">
<child_component></child_component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let childConstructor = Vue.extend({
template: `
<div>
<h2>我是子组件</h2>
<h2>{{message}}</h2>
</div>`
})
let app = new Vue({
el: '#first',
data:{
message: 'Hello Vue'
},
components:{
child_component: childConstructor,
}
})
</script>
</body>
</html>
1.2. 数组预先用props传递
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父子组件</title>
</head>
<body>
<div id="first">
<child_component v-bind:cmessage="message" v-bind:cmovies="movies"></child_component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let childConstructor = Vue.extend({
template: `
<div>
<h2>我是子组件</h2>
<h2>{{cmessage}}</h2>
<ul>
<li v-for="item in cmovies">{{item}}</li>
</ul>
</div>`,
props: ['cmovies', 'cmessage'],
})
let app = new Vue({
el: '#first',
data: {
message: 'Hello Vue',
movies: ['雷神', '钢铁侠', '诛仙', '蚁人', '超新星'],
},
components: {
child_component: childConstructor,
}
})
</script>
</body>
</html>
1.3. props–对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父子组件</title>
</head>
<body>
<div id="first">
<child_component v-bind:cmessage="message" v-bind:cmovies="movies"></child_component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let childConstructor = Vue.extend({
template: `
<div>
<h2>我是子组件</h2>
<h2>{{cmessage}}</h2>
<h2>{{cfirstname}}</h2>
<ul>
<li v-for="item in cmovies">{{item}}</li>
</ul>
</div>`,
props:{
cmessage: String,
cmovies: {
type:Array,
}
}
})
let app = new Vue({
el: '#first',
data:{
message: 'Hello Vue',
movies:['雷神','钢铁侠','诛仙','蚁人','超新星'],
},
components:{
child_component: childConstructor,
}
})
</script>
</body>
</html>
1.4 props驼峰
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父子组件</title>
</head>
<body>
<div id="first">
<child_component v-bind:c-first-name="firstName"></child_component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let childConstructor = Vue.extend({
template: `
<div>
{{cFirstName}}
</div>`,
props:{
cFirstName: String,
}
})
let app = new Vue({
el: '#first',
data:{
firstName: '舒展',
},
components:{
child_component: childConstructor,
}
})
</script>
</body>
</html>
2. 子传父
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父子组件</title>
</head>
<body>
<div id="first">
<sz_component v-on:childclick ="fatherclick"></sz_component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
let szConstructor = Vue.extend({
template: `
<div>
<h2>我是子组件</h2>
<button v-for="book in books" v-on:click="readbook(book)">{{book.name}}</button>
</div>
`,
data(){
return {
books: [
{id:'111',name:'java编程'},
{id:'222',name:'python入门'},
{id:'333',name:'操作系统'},
{id:'444',name:'排序算法'},
],
}
},
methods:{
readbook(item){
this.$emit('childclick',item);
}
}
})
let app = new Vue({
el: "#first",
data:{
message: '张三',
},
components:{
sz_component: szConstructor,
},
methods:{
fatherclick (item) {
console.log('方法触发')
console.log(item.name);
}
}
})
</script>
</body>