目录
4.1 父组件向子组件传值
1.组件内部通过props接收传递过来的值
2.父组件通过属性将值传递给子组件
1.组件内部通过props接收传递过来的值
Vue.component('menu-item', {
props: ['title'],
template: '<div>{{title}}</div>'
})
2.父组件通过属性将值传递给子组件
<menu-item title='来自父组件的值'></menu-item>
<menu-item :title='ptitle' content='hello'></menu-item>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
<div>{{pmsg}}</div>
<menu-item title='来自父组件的值'></menu-item>
<menu-item :title='ptitle' content='hello'></menu-item>
</div>
</body>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript" >
/*
父组件向子组件传值
1.组件内部通过props接收传递过来的值
Vue.component('menu-item', {
props: ['title'],
template: '<div>{{title}}</div>'
})
2.父组件通过属性将值传递给子组件
<menu-item title='来自父组件的值'></menu-item>
<menu-item :title='ptitle' content='hello'></menu-item>
*/
Vue.component('menu-item', {
props: ['title', 'content'],
data: function(){
return {
msg: '子组件本身的数据'
}
},
template: '<div>{{msg + "--" + title + content}}</div>'
})
var vm = new Vue({
el:'#app',
data:{
pmsg: "父组件内容",
ptitle: '动态绑定属性'
},
methods: {
handle: function (event) {
}
}
});
</script>
</html>
3.props 属性名规则
父组件向子组件传值
3.props 属性名规则
1.在props中使用驼峰形式,模板中需要使用短横线的形式(html页面标签)
Vue.component('menu-item', {
props: ['xyzTitle'],
template: '<div>{{xyzTitle}}</div>'
})
<menu-item xyz-title="父组件静态"></menu-item>
2.字符串形式的模板中没有这个限制
Vue.component('menu-item', {
props: ['xyzTitle'],
template: '<div>{{xyzTitle}}<third-com testTitle="hello"></third-com></div>'
});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
<div>{{pmsg}}</div>
<menu-item xyz-title="父组件静态"></menu-item>
</div>
</body>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript" >
/*
父组件向子组件传值
3.props 属性名规则
1.在props中使用驼峰形式,模板中需要使用短横线的形式(html页面标签)
Vue.component('menu-item', {
props: ['xyzTitle'],
template: '<div>{{xyzTitle}}</div>'
})
<menu-item xyz-title="父组件静态"></menu-item>
2.字符串形式的模板中没有这个限制
Vue.component('menu-item', {
props: ['xyzTitle'],
template: '<div>{{xyzTitle}}<third-com testTitle="hello"></third-com></div>'
});
*/
Vue.component('third-com', {
props: ['testTitle'],
template: '<div>{{testTitle}}</div>'
});
Vue.component('menu-item', {
props: ['xyzTitle'],
template: '<div>{{xyzTitle}}<third-com testTitle="hello"></third-com></div>'
});
var vm = new Vue({
el:'#app',
data:{
pmsg: "父组件内容1",
ptitle: '父组件内容2',
},
methods: {
handle: function (event) {
}
}
});
</script>
</html>
4.props属性值类型
4.1父组件向子组件传值
4.props属性值类型
1. 字符串String
<menu-item :pstr='pstr' ></menu-item>
2. 数值Number (要加: v-bind绑定,否则是字符串)
<menu-item :pnum='12'></menu-item>
3. 布尔值Boolean (要加: v-bind绑定,否则是字符串)
<menu-item :pboo='true'></menu-item>
4. 数组Array
data:{
parr: ['apple', 'orange', 'banana']
},
<menu-item :parr='parr'></menu-item>
5. 对象Object
data:{
pobj: {
name: 'lili',
age: 12,
gender: 'male'
}
},
<menu-item :pobj='pobj'></menu-item>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
<div>{{pmsg}}</div>
<menu-item :pstr='pstr' :pnum='12' :pboo='true' :parr='parr' :pobj='pobj'>
</menu-item>
</div>
</body>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript" >
/*
4.1父组件向子组件传值
4.props属性值类型
1. 字符串String
<menu-item :pstr='pstr' ></menu-item>
2. 数值Number (要加: v-bind绑定,否则是字符串)
<menu-item :pnum='12'></menu-item>
3. 布尔值Boolean (要加: v-bind绑定,否则是字符串)
<menu-item :pboo='true'></menu-item>
4. 数组Array
data:{
parr: ['apple', 'orange', 'banana']
},
<menu-item :parr='parr'></menu-item>
5. 对象Object
data:{
pobj: {
name: 'lili',
age: 12,
gender: 'male'
}
},
<menu-item :pobj='pobj'></menu-item>
*/
Vue.component('menu-item', {
props: ['pstr', 'pnum', 'pboo', 'parr', 'pobj'],
template:
`<div>
<div>{{pstr}}</div>
<div>{{typeof pnum}}</div>
<div>{{ typeof pboo}}</div>
<ul>
<li :key='index' v-for='(item, index) in parr'>{{item}}</li>
</ul>
<div>
<span>{{pobj.name}}</span>
<span>{{pobj.age}}</span>
<span>{{pobj.gender}}</span>
</div>
</div>
`
})
var vm = new Vue({
el:'#app',
data:{
pmsg: "父组件内容",
pstr: 'hello',
parr: ['apple', 'orange', 'banana'],
pobj: {
name: 'lili',
age: 12,
gender: 'male'
}
},
methods: {
handle: function (event) {
}
}
});
</script>
</html>
4.2 子组件向父组件传值
基本用法:
props传递数据原则:单向数据流;
1.子组件通过自定义事件向父组件传递信息
<button @click='$emit("enlarge-text")'>扩大字体</button>
2.父组件监听子组件的事件
<menu-item :parr='parr' @enlarge-text='handle'></menu-item>
3.子组件通过自定义事件向父组件传递信息 5就是传递的参数
<button @click='$emit("enlarge-text", 5)'>扩大字体</button>
4.父组件监听子组件的事件 $event参数接受固定写法
<menu-item :parr1='parr' @enlarge-text='handle($event)'></menu-item>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
<div :style='{fontSize: fontSize + "px"}'>{{pmsg}}</div>
<menu-item :parr1='parr' @enlarge-text='handle($event)'></menu-item>
</div>
</body>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript" >
/*
子组件向父组件传值-基本用法
props传递数据原则:单向数据流;
1.子组件通过自定义事件向父组件传递信息
<button @click='$emit("enlarge-text")'>扩大字体</button>
2.父组件监听子组件的事件
<menu-item :parr='parr' @enlarge-text='handle'></menu-item>
3.子组件通过自定义事件向父组件传递信息 5就是传递的参数
<button @click='$emit("enlarge-text", 5)'>扩大字体</button>
4.父组件监听子组件的事件 $event参数接受固定写法
<menu-item :parr1='parr' @enlarge-text='handle($event)'></menu-item>
*/
Vue.component('menu-item', {
props: ['parr1'],
template:
`
<div>
<ul>
<li :key='index' v-for='(item, index) in parr1'>
{{item}}</li>
</ul>
<button @click='parr1.push("lemon")'>点击</button>
<button @click='$emit("enlarge-text", 5)'>扩大字体</button>
<button @click='$emit("enlarge-text", 10)'>扩大字体</button>
</div>
`
})
var vm = new Vue({
el:'#app',
data:{
pmsg: "hello",
parr: ['apple', 'orange', 'banana'],
fontSize: 10,
},
methods: {
handle: function (val) {
//扩大字体大小
this.fontSize +=val;
}
}
});
</script>
</html>
4.3 非父子组件间传值
1.单独的事件中心管理组件间的通信
var hub = new Vue();
2.监听事件与销毁事件
监听:eventHub.$on('add-todo', addTodo);
销毁:eventHub.$off('add-todo');
3.触发事件
event.$emit('add-todo', 参数1)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
<div>
<button @click="handle">销毁tom</button>
</div>
<test-tom></test-tom>
<test-jerry></test-jerry>
</div>
</body>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript" >
/*
4.3 非父子组件间传值
1.单独的事件中心管理组件间的通信
var hub = new Vue();
2.监听事件与销毁事件
监听:eventHub.$on('add-todo', addTodo);
销毁:eventHub.$off('add-todo');
3.触发事件
event.$emit('add-todo', 参数1)
*/
//提供事件中心
var hub = new Vue();
Vue.component('test-tom', {
data: function(){
return {
num: 0
}
},
template:
`
<div>
<div>Tom:{{num}}</div>
<div>
<button @click='handle'>点击</button>
</div>
</div>
`,
methods: {
handle: function(){
//触发兄弟组件的事件
hub.$emit('jerry', 2);
}
},
mounted: function(){
hub.$on('tom-event', (val) =>{
this.num +=val;
});
},
});
Vue.component('test-jerry', {
data: function(){
return {
num: 0
}
},
template:
`
<div>
<div>Jerry:{{num}}</div>
<div>
<button @click='handle'>点击</button>
</div>
</div>
`,
methods: {
handle: function(){
//触发兄弟组件的事件
hub.$emit('tom-event', 1);
}
},
mounted: function(){
hub.$on('jerry', (val) =>{
this.num +=val;
});
},
});
var vm = new Vue({
el:'#app',
data:{
pmsg: "hello",
ptitle: "动态绑定属性",
ptitle2: "动态2"
},
methods: {
handle: function () {
hub.$off('tom-event');
}
}
});
</script>
</html>
4.4 组件插槽
组件插槽的作用
1.父组件向子组件传递内容
组件插槽基本用法
1.插槽位置
Vue.component('alert-box', {
template: `
<div>
<strong>ERROR:</strong>
<slot>默认内容</slot>
</div>
`,
});
2.插槽内容
<alert-box></alert-box> 无内容为插槽的默认内容
<alert-box>有bug发生</alert-box>
<alert-box>有2个bug发生</alert-box>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
<alert-box></alert-box>
<alert-box>有bug发生</alert-box>
<alert-box>有2个bug发生</alert-box>
</div>
</body>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript" >
/*
组件插槽的作用
1.父组件向子组件传递内容
组件插槽基本用法
1.插槽位置
Vue.component('alert-box', {
template: `
<div>
<strong>ERROR:</strong>
<slot>默认内容</slot>
</div>
`,
});
2.插槽内容
<alert-box></alert-box> 无内容为插槽的默认内容
<alert-box>有bug发生</alert-box>
<alert-box>有2个bug发生</alert-box>
*/
Vue.component('alert-box', {
template: `
<div>
<strong>ERROR:</strong>
<slot>默认内容</slot>
</div>
`,
});
var vm = new Vue({
el:'#app',
data:{
msg: "hello",
},
methods: {
handle: function (event) {
}
}
});
</script>
</html>
4.5 具名插槽
具名插槽
1.插槽定义
Vue.component('base-layout', {
template: `
<div>
<header >
<slot name='header'></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name='footer'></slot>
</footer>
</div>
`,
});
2.插槽内容
<base-layout>
<p slot='header'>标题信息</p>
<p>主要内容1</p>
<p>主要内容2</p>
<p slot='footer'>底部信息</p>
</base-layout>
3.template标签用于包裹多个标签
<template slot='header'>
<p>标题信息1</p>
<p>标题信息2</p>
</template>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
<base-layout>
<p slot='header'>标题信息</p>
<p>主要内容1</p>
<p>主要内容2</p>
<p slot='footer'>底部信息</p>
</base-layout>
<base-layout>
<template slot='header'>
<p>标题信息1</p>
<p>标题信息2</p>
</template>
<p>主要内容1</p>
<p>主要内容2</p>
<template slot='footer'>
<p >底部信息1</p>
<p >底部信息2</p>
</template>
</base-layout>
</div>
</body>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript" >
/*
具名插槽
1.插槽定义
Vue.component('base-layout', {
template: `
<div>
<header >
<slot name='header'></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name='footer'></slot>
</footer>
</div>
`,
});
2.插槽内容
<base-layout>
<p slot='header'>标题信息</p>
<p>主要内容1</p>
<p>主要内容2</p>
<p slot='footer'>底部信息</p>
</base-layout>
3.template标签用于包裹多个标签
<template slot='header'>
<p>标题信息1</p>
<p>标题信息2</p>
</template>
*/
Vue.component('base-layout', {
template: `
<div>
<header >
<slot name='header'></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name='footer'></slot>
</footer>
</div>
`,
});
var vm = new Vue({
el:'#app',
data:{
msg: "hello",
},
methods: {
handle: function (event) {
}
}
});
</script>
</html>
4.6 作用域插槽
作用域插槽
应用场景:父组件对子组件的内容进行加工处理
1.插槽定义
Vue.component('fruit-list', {
props:['list'],
template: `
<div>
<li :key='item.id' v-for='(item, index) in list'>
<slot :info='item'>
{{item.name}}
</slot>
</li>
</div>
`,
});
2.插槽内容
<div id="app">
<fruit-list :list='list'>
<template slot-scope='slotProps'>
<strong v-if="slotProps.info.id == 2" class="current">
{{slotProps.info.name}}
</strong>
<span v-else>
{{slotProps.info.name}}
</span>
</template>
</fruit-list>
</div>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
.current {
color: orange;
}
</style>
</head>
<body>
<div id="app">
<fruit-list :list='list'>
<template slot-scope='slotProps'>
<strong v-if="slotProps.info.id == 2" class="current">
{{slotProps.info.name}}
</strong>
<span v-else>
{{slotProps.info.name}}
</span>
</template>
</fruit-list>
</div>
</body>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript" >
/*
作用域插槽
应用场景:父组件对子组件的内容进行加工处理
1.插槽定义
Vue.component('fruit-list', {
props:['list'],
template: `
<div>
<li :key='item.id' v-for='(item, index) in list'>
<slot :info='item'>
{{item.name}}
</slot>
</li>
</div>
`,
});
2.插槽内容
<div id="app">
<fruit-list :list='list'>
<template slot-scope='slotProps'>
<strong v-if="slotProps.info.id == 2" class="current">
{{slotProps.info.name}}
</strong>
<span v-else>
{{slotProps.info.name}}
</span>
</template>
</fruit-list>
</div>
*/
Vue.component('fruit-list', {
props:['list'],
template: `
<div>
<li :key='item.id' v-for='(item, index) in list'>
<slot :info='item'>
{{item.name}}
</slot>
</li>
</div>
`,
});
var vm = new Vue({
el:'#app',
data:{
msg: "hello",
list: [{
id: 1,
name: 'apple'
},{
id: 2,
name: 'orange'
},{
id: 3,
name: 'banana'
}],
id: 3,
},
methods: {
handle: function (event) {
}
}
});
</script>
</html>