组件化
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<div id="app">
<my-cpn></my-cpn>
<my-cpn></my-cpn>
<my-cpn></my-cpn>
</div>
<script src="../js/vue.js"></script>
<script>
const cpnC = Vue.extend({
template: `
<div>
<h2>我是标题</h2>
<p>我是内容,哈哈哈哈哈</p>
<p>我是内容,哈哈哈哈哈</p>
</div>`
});
const app = new Vue({
el: '#app',
data: {
},
components: {
'my-cpn': cpnC
}
})
</script>
</body>
</html>
父组件和子组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<div id="app">
<cpn2></cpn2>
<cpn3></cpn3>
<cpn4></cpn4>
<cpn5></cpn5>
</div>
<template id="cpn5">
<div>
<h2>我是标题5</h2>
<p>我是内容,哈哈哈哈哈</p>
<p>我是内容,哈哈哈哈哈</p>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const cpnC1 = Vue.extend({
template: `
<div>
<h2>我是标题1</h2>
<p>我是内容,哈哈哈哈哈</p>
<p>我是内容,哈哈哈哈哈</p>
</div>`
});
Vue.component('cpn3', {
template: `
<div>
<h2>我是标题3</h2>
<p>我是内容,哈哈哈哈哈</p>
<p>我是内容,哈哈哈哈哈</p>
</div>`
})
Vue.component('cpn5', {
template: '#cpn5'
})
const cpnC2 = Vue.extend({
template: `
<div>
<h2>我是标题2</h2>
<p>我是内容,哈哈哈哈哈</p>
<p>我是内容,哈哈哈哈哈</p>
<cpn1></cpn1>
</div>`,
components: {
cpn1: cpnC1
}
});
const app = new Vue({
el: '#app',
data: {
},
components: {
cpn2: cpnC2,
cpn1: cpnC1,
cpn4: {
template: `
<div>
<h2>我是标题4</h2>
<p>我是内容,哈哈哈哈哈</p>
<p>我是内容,哈哈哈哈哈</p>
</div>`
}
}
})
</script>
</body>
</html>
组件通信-父传子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<div id="app">
<cpn5></cpn5>
<cpn :cmovies="movies" :cmessage="message"></cpn>
<cpn :cmovies="movies"></cpn>
<cpn :c-info="info"></cpn>
</div>
<template id="cpn5">
<div>
<h2>{{title}}</h2>
<p>我是内容,哈哈哈哈哈</p>
<p>我是内容,哈哈哈哈哈</p>
</div>
</template>
<template id="cpn">
<div>
<h2>{{cmessage}}</h2>
<h2>{{cmovies}}</h2>
<h2>{{cInfo}}</h2>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
Vue.component('cpn5', {
template: '#cpn5',
data() {
return {
title: '我是标题5'
}
}
})
const cpn = {
template: '#cpn',
props: {
cmessage: {
type: String,
default: 'aaaaa',
required: false
},
cmovies: {
type: Array,
default() {
return [];
}
},
cInfo: {
type: Object,
default() {
return {};
}
}
}
}
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
movies: ['海王', '海贼王', '海尔兄弟'],
info: {
name: 'jxd',
age: 23,
height: 170
}
},
components: {
cpn
}
})
</script>
</body>
</html>
组件通信-子传父
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<div id="app">
<cpn @itemclick="cpnClick"></cpn>
</div>
<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: 'aaa', name: '热门推荐' },
{ id: 'bbb', name: '手机数码' },
{ id: 'ccc', name: '家用电器' },
{ id: 'ddd', name: '电脑办公' },
]
}
},
methods: {
btnClick(item) {
this.$emit('itemclick', item);
}
}
}
const app = new Vue({
el: '#app',
data: {
},
components: {
cpn
},
methods:{
cpnClick(item){
console.log(item);
}
}
})
</script>
</body>
</html>
父子组件双向绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<div id="app">
<cpn :number="num" @numchange="numChange" />
</div>
<template id="cpn">
<div>
<h2>props:{{number}}</h2>
<h2>data:{{dnumber}}</h2>
<input type="text" :value="dnumber" @input="numInput">
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
num: 1
},
methods: {
numChange(value) {
this.num = parseInt(value);
}
},
components: {
cpn: {
template: '#cpn',
props: {
number: Number
},
data() {
return {
dnumber: this.number
}
},
methods: {
numInput(event) {
this.dnumber = event.target.value;
this.$emit('numchange', this.dnumber);
}
},
watch:{
}
}
}
})
</script>
</body>
</html>
组件访问-父访问子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<div id="app">
<div>
<cpn></cpn>
<cpn></cpn>
<cpn ref="aaa"></cpn>
<button @click="btnclick()">按钮</button>
</div>
</div>
<template id="cpn">
<div>
{{name}}
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
},
methods: {
btnclick() {
console.log(this.$refs.aaa.name);
}
},
components: {
cpn: {
template: '#cpn',
data() {
return {
name: '我是一个子组件'
}
},
methods: {
showMessage() {
console.log('showMessage');
}
}
}
}
})
</script>
</body>
</html>
组件访问-子访问父
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<div id="app">
<cpn></cpn>
</div>
<template id="cpn">
<div>
<h2>{{name}}</h2>
<button @click="btnclick">按钮</button>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
name: 'jxd'
},
components: {
cpn: {
template: '#cpn',
data() {
return {
name: '我是子组件'
}
},
methods: {
btnclick() {
console.log(this.$parent);
console.log(this.$parent.name);
console.log(this.$root);
console.log(this.$root.name);
}
}
}
}
})
</script>
</body>
</html>
组件插槽
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<div id="app">
<cpn><span>不使用插槽默认值</span></cpn>
<cpn></cpn>
<cpn></cpn>
<cpn></cpn>
<cpn1><span slot="center">标题</span></cpn1>
</div>
<template id="cpn">
<div>
<h2>我是组件</h2>
<p>我是组件,哈哈哈哈</p>
<slot><button>按钮</button></slot>
</div>
</template>
<template id="cpn1">
<div>
<slot name="left"><span>左边</span></slot>
<slot name="center"><span>中间</span></slot>
<slot me="right"><span>右边</span></slot>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
},
components: {
cpn: {
template: '#cpn'
},
cpn1: {
template: '#cpn1'
}
}
})
</script>
</body>
</html>
编译作用域
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<div id="app">
<cpn v-show="isShow"></cpn>
</div>
<template id="cpn">
<div>
<h2>我是子组件</h2>
<p>我是内容,哈哈哈哈</p>
<button v-show="isShow">按钮</button>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
isShow: true
},
components: {
cpn: {
template: '#cpn',
data() {
return {
isShow: false
}
}
}
}
})
</script>
</body>
</html>
作用域插槽
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<div id="app">
<cpn></cpn>
<cpn>
<template slot-scope="slot">
<span>{{slot.data.join(' - ')}}</span>
</template>
</cpn>
</div>
<template id="cpn">
<div>
<slot :data="pLanguages">
<ul>
<li v-for="item in pLanguages">{{item}}</li>
</ul>
</slot>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
},
components: {
cpn: {
template: '#cpn',
data() {
return {
pLanguages: ['JavaScript', 'C++', 'Java', 'C#', 'Python', 'Go']
}
}
}
}
})
</script>
</body>
</html>