Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

时间:2020-12-19 14:46:49

===重点重点开始 ==========================

(三) 组件化开发

1.创建组件构造器: Vue.extends()

2.注册组件: Vue.component()

3.使用组件(全局和局部组件)

一般方式:全局和局部组件

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 3.使用组件(要放到一个签中(<div>)) -->
<div>
<zjm></zjm>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 1. 创建组件模版(一般方式)
const 组件名 = Vue.extend({
template: `<div><h2>一般方式的组件内容</h2></div>`
})
// 2.注册全局组件(标签名+组件名),可以在多个vue实例中使用,开如中一般不用全局组件.
Vue.component('zjm', 组件名) // Vue实例对象(开发中一般只有一个vue实例)
const app = new Vue({
el: '#app', //挂载管理元素
data: {},
// 2.注册局部组件(标签名+组件名)
// components: {
// zjm: 组件名
// }
})
</script>
</body>
</html> 一般方式:全局和局部组件

一般方式:全局和局部组件

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

语法糖方式:全局和局部组件

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 3.使用组件 -->
<div>
<qjzjm></qjzjm>
</div>
<div>
<jbzjm></jbzjm>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 1-2.创建注册全部组件(语法糖方式)
Vue.component('qjzjm', {
template: `<div><h2>全局组件内容-语法糖</h2></div>`
})
// root根组件
const app = new Vue({
el: '#app', //挂载管理元素
data: {},
// 1-2.创建注册局部组件(语法糖方式)
components: {
'jbzjm': {
template: `<div><h2>局部组件内容-语法糖</h2></div>`
}
}
})
</script>
</body>
</html> 语法糖方式

语法糖方式

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

4.模板分离(2种方法)

方法1: <script>标签方法(一般不用)

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

方法2: 使用<template>标签方法(常用)

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!--4.使用组件-->
<div>
<qjcpn></qjcpn>
<jbcpn></jbcpn>
</div>
</div>
<!--3.分离组件中的模板,使用template标签方法,设id对应相应的组件,通过id联系在一起-->
<template id="qjzjm">
<div>
<h1>全部组件:使用template标签方法,分离组件中的模板!</h1>
</div>
</template>
<template id="jbzjm">
<div>
<h1>局部组件:使用template标签方法,分离组件中的模板!</h1>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 1-2.创建注册全部组件(语法糖方式),取个名字,后面跟个对象即可创建.
Vue.component('qjcpn', {
template: '#qjzjm',
data() {
return {
msg: '组件中的msg数据'
}
}
})
const app = new Vue({
el: '#app',
data: {},
// 1-2.创建注册局部组件(语法糖方式)
components: {
'jbcpn': {
template: `#jbzjm`
}
}
})
</script>
</body>
</html> 使用template标签方法

使用template标签方法

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

5.组件中数据,组件中的data必需是一个函数,同时返回是一个对象,vue实例中是一个属性不是一个函数,二者的数据不能直接访问,每次使用组件时就会调用data()函数,如果不是函数,组件在二次使用时,就会出现同一个数据.

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!--4.使用组件-->
<cpn></cpn>
<cpn></cpn>
<h1>{{msg}}</h1>
</div>
<template id="mytemplate">
<div>
<h1>方法2:使用template标签方法,分离组件中的模板!</h1>
<h1>{{msg}}</h1>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 1.注册一个全局组件,取个名字,后面跟个对象即可创建.
Vue.component('cpn',{
// 2.分离模板要对应模板中的id(#mytemplate)
template:'#mytemplate',
// 这里必需是一个函数,同时返回是一个对象.
data(){
return {
msg: '组件中的msg数据'
}
}
})
const app = new Vue({
el: '#app',
data: {
msg: '实例中的msg数据'
}
})
</script>
</body>
</html>

组件中的data必需是一个函数

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

 加减实例(组件内数据data为什么是一个函数实例说明)

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!--4.使用组件,重复使用不相互影响-->
<cpn></cpn>
<cpn></cpn>
</div>
<template id="mytemplate">
<div>
<h1>当前计数:{{counter}}</h1>
<button @click="zj">增加+</button>
<button @click="js">减少-</button>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 1.注册一个全局组件,取个名字,后面跟个对象即可创建.
Vue.component('cpn',{
// 2.分离模板要对应模板中的id(#mytemplate)
template:'#mytemplate',
// 这里必需是一个函数,同时返回是一个对象,这样重复使用就不相互影响.
data(){
return {
msg: '组件中的msg数据',
counter: 0
}
},
methods:{
zj(){this.counter++},
js(){this.counter--}
},
})
const app = new Vue({
el: '#app',
data: {
msg: '实例中的msg数据'
}
})
</script>
</body>
</html>

加减实例

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

6.父子组件 

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 4.使用组件 -->
<fzjm></fzjm>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 1. 创建组件模版(子组件)
const zzjm = Vue.extend({
template: `<div><h2>组件内容1-子组件名zzjm</h2></div>`
}) // 2. 创建组件模版(父组件,将子组件放到父组件中)
const fzjm = Vue.extend({
template: `
<div>
<h2>组件内容2-父组件名fzjm</h2>
<!--// 在父组件中使用子组件-->
<zzjm></zzjm>
</div>
`,
components: {
zzjm: zzjm,
}
})
// root根组件
const app = new Vue({
el: '#app', //挂载管理元素
data: {},
// 3.注册局部组件(标签名+组件名)
components: {
// 将父组件放到Vue实例root根组件中,没有在根组件中注册的组件不能直接使用(组件名1不能直接使用).
fzjm: fzjm,
}
})
</script>
</body>
</html> 父子组件一般方式

父子组件一般方式

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 4.使用组件 -->
<fzjm></fzjm>
</div>
<template id="zzjmb">
<div>
<h2>子组件在父组件中使用:使用template标签方法,分离组件中的模板!</h2>
</div>
</template>
<template id="fzjmb">
<div>
<h1>父组件</h1>
<!--// 在父组件中使用子组件-->
<zzjm></zzjm>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 1. 创建组件模版(子组件)
const zzjm = Vue.extend({
template: '#zzjmb'
})
// 2. 创建组件模版(父组件,将子组件放到父组件中)
const fzjm = Vue.extend({
template: '#fzjmb',
components: {
zzjm: zzjm,
}
})
// root根组件
const app = new Vue({
el: '#app', //挂载管理元素
data: {},
// 3.注册局部组件(标签名+组件名)
components: {
// 将父组件放到Vue实例root根组件中,没有在根组件中注册的组件不能直接使用(组件名1不能直接使用).
fzjm: fzjm,
}
})
</script>
</body>
</html> 父子组件模版分离方式

父子组件模版分离方式

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 4.使用子组件 -->
<zzjm></zzjm>
</div>
<!--3.子组件模板-->
<template id="zzjmb">
<div>
<h2>常用子组件在根组件(父组件)中使用</h2>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// root根组件(父组件,开发中一般是这种写法)
const app = new Vue({
el: '#app', //挂载管理元素
data: {},
// 1-2.创建注册局部组件(语法糖方式)
components: {
'zzjm': {
template: '#zzjmb'
}
}
})
</script>
</body>
</html> 父子组件在根组件中使用(常用)

父子组件在根组件中使用(常用)

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

7.组件模板中的数据,不能直接在根组件中显示

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<body>
<div id="app">
<!-- 4.使用组件 -->
<zjm2></zjm2>
<!-- 不能直接用组件2中的数据的,同时要报错! -->
{{title}}
</div>
<template id="zjm2">
<div>
<h2> 组件2内容</h2>
<h2> {{title}}</h2>
</div>
</template>
<script>
// root根组件
const app = new Vue({
el: '#app', //挂载管理元素
data: {},
// 1-2.创建注册局部组件(语法糖方式)
components: {
zjm2: {
template: '#zjm2',
data() {
return {
title: '组件2中的数据'
} }
}
}
})
</script>
</body>

组件模板中的数据

8.父子组件的通信(数据的传递)

A:父传子: props

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 5.绑定父子组件中的值,绑定后子组件中就可以使用父组件中的数据了,===> 7.展示子组件中数据 -->
<zzj1 v-bind:users1='users' v-bind:msg1='msg'> </zzj1>
</div>
<!-- 3.子组件模版 -->
<template id="zzjmb">
<div>
<!-- 6.在子组件中使用父组件的值users和msg,必需用子组件中的变量users1和msg1 -->
<h2>props父组件中的值:{{users1}}</h2>
<h2>props父组件中的值:{{msg1}}</h2>
<h2>props父组件中的值:循环对象中的值</h2>
<ul>
<li v-for='item in users1'>{{item}}</li>
</ul>
<!--子组件data中的数据-->
<h2>{{title}}</h2>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// root根组件(父组件)
const app = new Vue({
el: '#app',
// 将下面data中数据传给子组件展示
data: {
msg:'长安镖局',
users: ['特朗普1', '特朗普2', '特朗普3', '特朗普4', '特朗普5', '特朗普6', ]
},
// 1-2.创建注册局部组件(语法糖方式)
components: {
zzj1: {
template: '#zzjmb',
data() {return {title: '子组件data中的数据'}
},
// 4.设置绑定父组件中的变量名users1,msg1
// 方法一:数组的写法,很少用.
props: ['users1', 'msg1']
}
}
})
</script>
</body>
</html> 数组写法(很少用)

数组写法(很少用)

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 5.绑定父子组件中的值,绑定后子组件中就可以使用父组件中的数据了,===> 7.展示子组件中数据 -->
<zzj1 v-bind:users1='users' v-bind:msg1='msg'> </zzj1>
</div>
<!-- 3.子组件模版 -->
<template id="zzjmb">
<div>
<!-- 6.在子组件中使用父组件的值users和msg,必需用子组件中的变量users1和msg1 -->
<h2>props父组件中的值:{{users1}}</h2>
<h2>props父组件中的值:{{msg1}}</h2>
<h2>props父组件中的值:循环对象中的值</h2>
<ul>
<li v-for='item in users1'>{{item}}</li>
</ul>
<!--子组件data中的数据-->
<h2>{{title}}</h2>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// root根组件(父组件)
const app = new Vue({
el: '#app',
// 将下面data中数据传给子组件展示
data: {
msg:'长安镖局',
users: ['特朗普1', '特朗普2', '特朗普3', '特朗普4', '特朗普5', '特朗普6', ]
},
// 1-2.创建注册局部组件(语法糖方式)
components: {
zzj1: {
template: '#zzjmb',
data() {return {title: '子组件data中的数据'}
},
// 4.设置绑定父组件中的变量名users1,msg1
// 方法一:数组的写法,很少用.
// props: ['users1', 'msg1']
// 方法二:对象的写法
props: {
users1: Array, //Array数组类型,String字符型,还可以指定验证要求,设置默认值,变量名不能写骆峰格式,不然上面展示时要转换格式才能绑定.
msg1:Array
}
}
}
})
</script>
</body>
</html>
对象写法(常用)

对象写法(常用)

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 5.绑定父子组件中的值,绑定后子组件中就可以使用父组件中的数据了,===> 7.展示子组件中数据 -->
<zzj1 v-bind:msg1='msg' v-bind:users1='users'> </zzj1>
</div>
<!-- 3.子组件模版 -->
<template id="zzjmb">
<div>
<!-- 6.在子组件中使用父组件的值users和msg,必需用子组件中的变量users1和msg1 -->
<h2>props父组件中的值:{{users1}},{{msg1}}</h2>
<h2>props父组件中的值:循环显示对象中的值</h2>
<ul><li v-for='item in users1'>{{item}}</li></ul>
<!--子组件data中的数据-->
<h2>{{title}}</h2>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
// 将下面data中数据传给子组件展示
data: {
users: ['特朗普1', '特朗普2', '特朗普3', '特朗普4', '特朗普5', '特朗普6', ],
msg:'长安镖局'
},
// 1-2.创建注册局部组件(语法糖方式)
components: {
zzj1: {
template: '#zzjmb',
data() {return {title: '子组件data中的数据'}
},
// 4.设置绑定父组件中的变量名users1,msg1
// 方法一:数组的写法,很少用,里面是一个变量名.
// props: ['users1', 'msg1']
// 方法二:对象的写法,设置变量名同时设定他的类型.
// 变量名为users1: 变量名类型为数组Array, 变量名为msg1: 变量名类型为字符型String.
// props: {
// users1: Array, // 变量名不能写骆峰格式,不然上面展示时要转换格式才能绑定.
// msg1:String
// }
props: {
users1: Array, // 变量名不能写骆峰格式,不然上面展示时要转换格式才能绑定.
msg1: {
type:String,
default:'我是长安镖局!' // 如果前面没有传值就显示默认的值
},
// 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
// propA: Number,
// 多个可能的类型
// propB: [String, Number],
// 必填的字符串
// propC: {
// type: String,
// required: true
// },
// 带有默认值的数字
// propD: {
// type: Number,
// default: 100
// },
// 带有默认值的对象
// propE: {
// type: Object,
// 对象或数组默认值必须从一个工厂函数获取
// default: function () {
// return { message: 'hello' }
// }
// },
// 自定义验证函数
// propF: {
// validator: function (value) {
// // 这个值必须匹配下列字符串中的一个
// return ['success', 'warning', 'danger'].indexOf(value) !== -1
// }
// }
}
}
}
})
</script>
</body>
</html> 对象写法prop验证类型说明

对象写法prop验证类型说明

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

A:子传父(自定义事件)

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 父组件模版 -->
<div id="app">
<!-- 6.将子组件传递的事件绑定到父组件中,默认自带子组件的参数值 -->
<zzj1 @zzjjiajia='fjiajia'></zzj1>
<!-- 8.展示数据-->
点击次数:{{total}}
</div>
<!-- 3.子组件模版 -->
<template id="zzjmb">
<div>
<!-- 4.子组件绑定事件 -->
<button @click='jiajia'>+1</button>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// root根组件(父组件)
const app = new Vue({
el: '#app', //挂载管理元素
data: {total: 0},
// 1-2.创建注册局部组件(语法糖方式)
components: {
'zzj1':{
template: '#zzjmb',
data() {return {num: 0}},
methods: {
jiajia() {
this.num++;
// 5.用$emit方法,发射绑定事件和值
this.$emit('zzjjiajia', this.num) // 发射出的事件名称,自已取名,发射的值this.num.
}
},
}
},
methods: {
// 7.在父组件中处理子组件传递的事件
fjiajia(num) {
this.total = num // 将子组件中的num赋值给total
}
}
})
</script>
</body>
</html> 子传父加加例子

子传父加加例子

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app"> <!--父组件模版-->
<!-- 5.监听子组件item-click发射的事件,自定义接收事件名称(zzjitemclick),这里默认把值item传了过来-->
<zzj @item-click='zzjitemclick'></zzj>
</div>
<template id="zzjmb"> <!--子组件模版 -->
<div>
<!--3.绑定点击事件和要传的值(item),自定义事件名称(btnclick),循环分类(fenlei)展示数据-->
<button v-for="item in fenlei" @click='btnclick(item)'>{{item.name}}</button>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {},
// 6.在父组件中使用子组件事件和值,这里item和msg都是形参,按传入的位置取值.
methods: {
zzjitemclick(item, msg) {
console.log(item, msg);
},
},
// 1-2.创建注册局部组件(组件名+对象)
components: {
'zzj': {
template: '#zzjmb', // 子组件模版id
data() {
return {
fenlei: [
{id: 1, name: '企业用户信息'},
{id: 2, name: '业务基础信息'}
],
msg: '长安镖局',
}
},
methods: {
btnclick(item) {
// 4.用$emit方法发射点击事件和值,自定义发射事件的名称(item-click).
this.$emit('item-click', item, this.msg) // 传模版中的数据不能写成this.item,传data中的数据就要加this
}
}
}
}
})
</script>
</body>
</html> 子传父分类例子

子传父分类例子

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--父组件模板-->
<div id="app">
<!-- 3.绑定子父组件中值的变量(zusers对应父的users,msg对应zmsg),子组件就可以使用父组件中的数据了,===> 5.展示子组件中数据 -->
<!-- 8.子传父:3.监听子组件item-click发射的事件,定义一个父组件中使用的事件名zzjitemclick,这里默认把值item传了过来-->
<zzj v-bind:zusers='users' v-bind:zmsg='msg' @item-click='zzjitemclick'></zzj>
</div>
<!--子组件模版 -->
<template id="zzjmb">
<div>
<!-- 4.在子组件中使用父组件的值users和msg,必需用子组件中自定义的变量zusers和zmsg-->
<!-- 6.子传父:1.将点击事件和值传给父组件,绑定子组件中点击事件@click和item值-->
<button v-for='item in zusers' @click='btnclick(item,zmsg)'>{{item.name}}</button>
<h2>父组件中的数据:{{zmsg}}</h2>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
// 将下面data中数据传给子组件展示
data: {
users: [
{id: 1, name: '企业用户信息'},
{id: 2, name: '业务基础信息'} ],
msg:'长安镖局'
},
// 9.子传父:4.在父组件中使用子组件事件和值,这里item和title都是形参,按传入的位置取值.
methods: {
zzjitemclick(item,zmsg,title){
console.log(item,zmsg,title);
},
},
// 1.创建注册局部子组件(组件名+对象)
components: {
zzj: {
template: '#zzjmb', //子组件模版id
data() {
return {
title: '子组件data中的数据',
}
},
// 2.设置父组件中值对应子组件中的变量名,自定义子数据变量名zusers对应父的users,msg对应zmsg.
props: {
zusers: Array, // 变量名不能写骆峰格式,不然上面展示时要转换格式才能绑定.
zmsg: {
type: String,
default: '我是长安镖局!' // 如果前面没有传值就显示默认的值
}
},
methods: {
btnclick(item,zmsg) {
// console.log(item);
// 7.子传父:2.用$emit方法,发射点击绑定事件和值,传模版中的数据不加this,传data中的数据就要加this.
this.$emit('item-click',item, zmsg,this.title) //自定义发射的事件名称item-click
}
}
}
}
})
</script>
</body>
</html> 父传子再传父分类例子

父传子再传父分类例子

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

9.父子组件的访问方式($children)

A:父组件访问子组件:使用$children或$refs

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--父组件模版-->
<div id="app">
<zzj1></zzj1> <!--使用子组件1-->
<zzj1></zzj1> <!--使用子组件2-->
<button @click="btnclick">按钮</button>
</div>
<!--子组件模版-->
<template id="zzjmb">
<div><h2>子组件data中的数据:{{title}}</h2></div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {},
methods:{
btnclick(){
console.log(this.$children)
// 在父组件中执行子组件1中的方法,
this.$children[0].showmsg()
// 在父组件中执行子组件2中的方法,
this.$children[1].showmsg()
}
},
// 1.创建注册局部组件(组件名+对象)
components: {
zzj1: {
template: '#zzjmb',
data() {return {title: '子组件data中的数据'}
},
methods: {
// 子组件里的方法
showmsg(){
console.log('我是子组件里的方法')
}
}
}
}
})
</script>
</body>
</html> 父访问子($children)不常用

父访问子($children)不常用

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--父组件模版-->
<div id="app">
<zzj1 ref="ref1"></zzj1> <!--使用子组件1,加一个属性-->
<zzj1 ref="ref2"></zzj1> <!--使用子组件2,加一个属性-->
<button @click="btnclick">按钮</button>
</div>
<!--子组件模版-->
<template id="zzjmb">
<div><h2>子组件data中的数据:{{title}}</h2></div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {},
methods:{
btnclick(){
// $refs对象类型,默认空
console.log(this.$refs)
// 在父组件中执行子组件1中的方法,
this.$refs.ref1.showmsg()
// 在父组件中执行子组件2中的方法,
this.$refs.ref2.showmsg()
}
},
// 1.创建注册局部组件(组件名+对象)
components: {
zzj1: {
template: '#zzjmb',
data() {return {title: '子组件data中的数据'}
},
methods: {
// 子组件里的方法
showmsg(){
console.log('我是子组件里的方法')
}
}
}
}
})
</script>
</body>
</html>
父访问子($refs)常用

父访问子($refs)常用

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

Vue学习笔记-Vue.js-2.X 学习(二)===>组件化开发

B:子组件访问父组件:使用$parent和$root 实际开发中不建义用.

Vue学习笔记-Vue.js-2.X 学习(三)