创建组件构造器对象
const cpnC = Vue.extend({
template: `
标题
`
})
``(模版字符串)是ES6中的新的定义字符串的语法,最大的特点就是可以换行
//使用''的话,换行要用+ const str = 'abc' + 'bcd' //使用``的话 const str = `abc bcd`
注册组件
Vue.component('my-cpn', cpnC)
使用组件
<div id='app'>
<my-cpn>my-cpn>
div>
整体代码
<div id='app'>
//3、使用组件
<my-cpn>my-cpn>
div>
<script src="vue.js">script>
<script>
//1、创建组件构造器对象
const cpnC = Vue.extend({
template: `
标题
`
})
//2、注册组件
Vue.component('my-cpn', cpnC)
const app = new Vue({
el: '#app',
data: {
}
})
script>
组件还需要挂载在某个vue实例下才会生效
直接在script中写这个的就是全局组件
Vue.component('my-cpn', cpnC)
如果在vue实例下注册就是局部组件
compotents: {
//cpn使用组件时的标签名
cpn: cpnC
}
//子组件
const cpnC1 = Vue.extend({
template: `
标题
`
})
//父组件
const cpnC2 = Vue.extend({
template: `
标题
`,
components: {
cpnc1: cpnC1
}
})
//root组件
const app = new Vue({
el: '#app',
data: {
}
components:{
cpnc2: cpnC2
},
})
省去了调用Vue.extend()的步骤,而是直接可以使用一个对象来代替。
Vue.component('my-cpn', {
template: `
标题
`
})
const app = new Vue({
el: '#app',
data: {
}
components:{
'cpn2': {
template: `
标题
`
}
},
})
若在script中写太多html代码不好看,可以将其分离:
<script type="text/template" id="cpn">
<div>
<h2>
title
</h2>
</div>
script>
//或者使用template标签
<template id="cpn">
<div>
<h2>
title
h2>
div>
template>
<script src="vue.js">script>
<script>
Vue.component('my-cpn', {
template: '#cpn'
})
const app = new Vue({
el: '#app',
data: {
}
script>
组件不可以访问vue实例数据。vue组件应该有自己保存数据的地方。
组件数据存于data()中,data必须是一个函数,其返回一个对象,对象内部保存数据。
Vue.component('my-cpn', { template: `#cpn`, data() { return { title: 'abc' } } })
<div id="app">
cpn>
div>
<template id="cpn">
<div>
<ul v-for="item in cmovies">{{item}}ul>
<h2>{{cmessage}}h2>
div>
template>
<script src="vue.js">script>
<script>
// 子组件
const cpn = {
template: '#cpn',
props: ['cmovies', 'cmessage'],
data(){
return{}
},
methods: {
}
}
// 父组件
const app = new Vue({
el: '#app',
data: {
movies: ['1', '2', '3'],
message: 'www'
},
components: {
cpn
}
})
script>
props: {
// 1、类型限制
comive: Array,
cmessage: String,
// 2、提供一些默认值,或者一些必传值
cmessage: {
type: String,
default: 'flase',
required: true
},
// 类型是数组或者对象(Array或者Object)的时候,默认值必须是一个函数
cmovies: {
type: Array,
default() {
return []
}
}
}
<div id="app">
<cpn @item-click="cpnClick">cpn>
div>
<template id="cpn">
<div>
<button v-for="item in catagories"
@click="btnClick(item)"
>{{item.name}}button>
div>
template>
<script src="vue.js">script>
<script>
// 子组件
const cpn = {
template: '#cpn',
data() {
return {
catagories: [
{id: 'aaa', name: 'one'},
{id: 'bbb', name: 'two'},
{id: 'ccc', name: 'three'},
]
}
},
methods: {
btnClick(item) {
// 发射事件: 自定义事件
this.$emit('item-click', item)
}
}
}
// 父组件
const app = new Vue({
el: '#app',
data: {
},
components: {
cpn
},
methods:{
cpnClick(item) {
console.log('cpnClick', item);
}
}
})
script>
$children
或$refs
$parent
$children
:一般用于取出所有子组件的message状态。
<div id="app">
<cpn>cpn>
<cpn>cpn>
<cpn>cpn>
<button @click="btnClick">1212button>
div>
<template id="cpn">
<div>我是子组件div>
template>
<script src="vue.js">script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好!'
},
methods: {
btnClick() {
// 1、$children
console.log(this.$children);
console.log(this.$children[2].name);
}
},
components: {
cpn: {
template: '#cpn',
data() {
return {
name: '子组件的name'
}
}
},
}
})
script>
$refs
=>对象类型, 默认是一个空对象
<cpn ref="aaa">cpn>
btnClick() {
//2、$refs
console.log(this.$refs.aaa);
}
主要参考这个教学视频学习:https://www.bilibili.com/video/BV15741177Eh?p=1