目录
1.组件内部通过props接收传递过来的值
Vue.component('menu-item', {
props: ['title'],
template: '{{title}}'
})
2.父组件通过属性将值传递给子组件
- 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 属性名规则
1.在props中使用驼峰形式,模板中需要使用短横线的形式(html页面标签)
Vue.component('menu-item', {
props: ['xyzTitle'],
template: '{{xyzTitle}}'
})
2.字符串形式的模板中没有这个限制
Vue.component('menu-item', {
props: ['xyzTitle'],
template: '{{xyzTitle}}'
});
- 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.1父组件向子组件传值
4.props属性值类型
1. 字符串String
2. 数值Number (要加: v-bind绑定,否则是字符串)
3. 布尔值Boolean (要加: v-bind绑定,否则是字符串)
4. 数组Array
data:{
parr: ['apple', 'orange', 'banana']
},
5. 对象Object
data:{
pobj: {
name: 'lili',
age: 12,
gender: 'male'
}
},
- 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>
基本用法:
props传递数据原则:单向数据流;
1.子组件通过自定义事件向父组件传递信息
2.父组件监听子组件的事件
3.子组件通过自定义事件向父组件传递信息 5就是传递的参数
4.父组件监听子组件的事件 $event参数接受固定写法
- 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>
1.单独的事件中心管理组件间的通信
var hub = new Vue();
2.监听事件与销毁事件
监听:eventHub.$on('add-todo', addTodo);
销毁:eventHub.$off('add-todo');
3.触发事件
event.$emit('add-todo', 参数1)
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <div id="app">
- <div>
- <button @click="handle">销毁tombutton>
- 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:
- `
-
- Tom:{{num}}
-
-
-
-
- `,
- 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:
- `
-
- Jerry:{{num}}
-
-
-
-
- `,
- 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>
组件插槽的作用
1.父组件向子组件传递内容
组件插槽基本用法
1.插槽位置
Vue.component('alert-box', {
template: `
ERROR:
默认内容
`,
});
2.插槽内容
无内容为插槽的默认内容
有bug发生
有2个bug发生
- 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>
具名插槽
1.插槽定义
Vue.component('base-layout', {
template: `
`,
});
2.插槽内容
标题信息
主要内容1
主要内容2
底部信息
3.template标签用于包裹多个标签
标题信息1
标题信息2
- html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>title>
- head>
- <body>
- <div id="app">
- <base-layout>
- <p slot='header'>标题信息p>
- <p>主要内容1p>
- <p>主要内容2p>
- <p slot='footer'>底部信息p>
-
- base-layout>
-
- <base-layout>
- <template slot='header'>
- <p>标题信息1p>
- <p>标题信息2p>
- template>
- <p>主要内容1p>
- <p>主要内容2p>
- <template slot='footer'>
- <p >底部信息1p>
- <p >底部信息2p>
- 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>主要内容1p>
- <p>主要内容2p>
- <p slot='footer'>底部信息p>
-
- base-layout>
- 3.template标签用于包裹多个标签
- <template slot='header'>
- <p>标题信息1p>
- <p>标题信息2p>
- 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>
作用域插槽
应用场景:父组件对子组件的内容进行加工处理
1.插槽定义
Vue.component('fruit-list', {
props:['list'],
template: `
{{item.name}}
`,
});
2.插槽内容
{{slotProps.info.name}}
{{slotProps.info.name}}
- 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>