07-组件通信、slot插槽
一、组件通信
① 父 => 子
-- 步骤
1)子组件中通过 props 键接受父组件传值
2)父组件通过 v-bind 向子组件传值
--例子
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <title>Document</title>
- <meta charset="UTF-8">
- </head>
- <body>
- <div id="app">
- <parent></parent>
- </div>
- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
- <script>
- Vue.component('parent',{
- data(){
- return {
- parentMsg : 'parent'
- }
- },
- template:`
- <div>
- <p>父组件</p>
- <p>组件值 {{ parentMsg }}</p>
- //调用子组件,并传值
- <son v-bind:sendMsg="parentMsg"></son>
- </div>
- `,
- // 子组件
- components:{
- son:{
- //接受父组件传递的值
- props:['sendMsg'],
- template:`
- <div>
- <p>子组件</p>
- <p>接受父组件的值:{{ sendMsg }}</p>
- </div>
- `
- }
- }
- })
- let vm = new Vue({
- el: '#app',
- })
- </script>
- </body>
- </html>
效果图:
② 子 => 父
-- 步骤
1)子组件自定义事件,通过 $emit 触发
语法:this.$emit( ' 事件名称 ',数据1,... ,数据n )
2)父组件调用事件获取数据
-- 例子
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <title>Document</title>
- <meta charset="UTF-8">
- </head>
- <body>
- <div id="app">
- <parent></parent>
- </div>
- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
- <script>
- Vue.component('parent', {
- data(){
- return {
- sendsonMsg:null
- }
- },
- template: `
- <div>
- <p>父组件</p>
- <p>子组件值 {{ sendsonMsg }}</p>
- <!-- 2.调用子组件 -->
- <son @sonSend = 'showSonMsg'></son>
- </div>
- `,
- methods: {
- // 3.定义方法
- showSonMsg(data){
- this.sendsonMsg = data;
- }
- },
- // 子组件
- components: {
- son: {
- template: `
- <div>
- <p>子组件</p>
- <p>子组件的值:{{ sonMsg }}</p>
- </div>
- `,
- data() {
- return {
- sonMsg:'sonData'
- }
- },
- // 1.$emit 触发
- mounted() {
- this.$emit('sonSend', this.sonMsg)
- },
- }
- }
- })
- let vm = new Vue({
- el: '#app',
- })
- </script>
- </body>
- </html>
效果图
③ 兄弟组件通信 (event bus)
-- 步骤
1)定义数据共享中心
const eventBus = new Vue();
2)发送数据
eventBus .$emit( ' 事件名 ',数据1,... ,数据n )
3)接收数据
eventBus .$on(' 事件名 ',处理函数)
-- 例子
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <title>Document</title>
- <meta charset="UTF-8">
- </head>
- <body>
- <div id="app">
- <mytag1></mytag1>
- <mytag2></mytag2>
- </div>
- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
- <script>
- Vue.component('mytag1',{
- data(){
- return {
- tagMsgOne:'tag1Data',
- tagMsg:null
- }
- },
- template:`
- <div>
- <p>兄弟组件一</p>
- <button @click='sendDataOne'>传递信息</button>
- <p>兄弟组件一数据:{{ tagMsgOne }}</p>
- <p>兄弟组件二传递的数据:{{ tagMsg }}</p>
- <hr />
- </div>
- `,
- methods: {
- sendDataOne(){
- eventBus.$emit('event', this.tagMsgOne)
- }
- },
- mounted(){
- // 3.接收数据
- eventBus.$on('tagTwo',(data) => {
- this.tagMsg = data
- })
- }
- })
- Vue.component('mytag2',{
- data(){
- return {
- tagMsgTwo:'tag2Data',
- tagMsg:null
- }
- },
- template:`
- <div>
- <p>兄弟组件二</p>
- <button @click='sendDataTwo'>传递信息</button>
- <p>兄弟组件二数据:{{ tagMsgTwo }}</p>
- <p>兄弟组件一传递数据:{{ tagMsg }}</p>
- </div>
- `,
- mounted() {
- eventBus.$on('event',(data) => {
- this.tagMsg = data;
- })
- },
- methods:{
- // 2.发送数据
- sendDataTwo(){
- eventBus.$emit('tagTwo',this.tagMsgTwo)
- }
- }
- })
- // 1.创建共享数据中心
- const eventBus = new Vue();
- let vm = new Vue({
- el: '#app',
- data: {
- },
- methods: {
- }
- })
- </script>
- </body>
- </html>
效果图
二、solt 插槽
为什么要用插槽:封装一个组件,每次调用显示不同的信息
① 后备内容
-- 步骤
1)定义组件时内容去用 <slot></slot> 占位
2)调用组件时,组件标签内容后同步到插槽占位符中
--例子
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <title>Document</title>
- <meta charset="UTF-8">
- </head>
- <body>
- <div id="app">
- <mytag>提示信息</mytag>
- </div>
- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
- <script>
- // 定义组件
- Vue.component('mytag',{
- template:`
- <div style='border:1px solid red;max-width:200px'>
- <!-- 占位符 -->
- <slot></slot>
- </div>
- `
- })
- let vm = new Vue({
- el: '#app',
- })
- </script>
- </body>
- </html>
效果图
② 具名插槽
--步骤
1)定义组件时,用 slot 占位
<slot name=' 标识 '></slot>
2)调用组件时,根据标识显示数据
<template v-slot:标识>
//html 标签
</template>
--例子
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <title>Document</title>
- <meta charset="UTF-8">
- </head>
- <body>
- <div id="app">
- <mytag>
- <template v-slot:test>
- test
- </template>
- </mytag>
- </div>
- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
- <script>
- // 定义显示数据
- // 定义组件
- Vue.component('mytag',{
- template:`
- <div style='border:1px solid red;max-width:200px'>
- <!-- 占位符 -->
- <slot name= 'test'></slot>
- </div>
- `
- })
- let vm = new Vue({
- el: '#app',
- })
- </script>
- </body>
- </html>
效果图
③ 作用域插槽
--步骤
1)定义组件时,用 slot 占位
<slot name=' 标识 ' v-bind:任意名称 = ' data 中的键 '></slot>
2)调用组件
<template v-slot:标识 = ' 任意名称 '>
//html 标签
</template>
--例子
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <title>Document</title>
- <meta charset="UTF-8">
- </head>
- <body>
- <div id="app">
- <mytag>
- <template v-slot:index='item'>
- this is index
- {{ item.data }}
- </template>
- </mytag>
- </div>
- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
- <script>
- // 定义显示数据
- // 定义组件
- Vue.component('mytag', {
- data() {
- return {
- msg1:'msg1',
- msg2:'msg2'
- }
- },
- template: `
- <div>
- <!-- 占位符 -->
- <slot name='index' :data='msg1'></slot>
- </div> `
- })
- let vm = new Vue({
- el: '#app',
- })
- </script>
- </body>
- </html>
效果图
- 特此声明:如需转载请注明出处,如有疑问请及时提出以便于改正,如有侵权,联系删除,谢谢
07-组件通信、slot插槽的更多相关文章
- 总结Vue第二天:自定义子组件、父子组件通信、插槽
总结Vue第二天:自定义子组件.父子组件通信.插槽 一.组件: 组件目录 1.注册组件(全局组件.局部组件和小demo) 2.组件数据存放 3.父子组件通信(父级向子级传递数据.子级向父级传递数据) ...
- 8.Vue组件三---slot插槽
主要内容: 1. 什么是插槽 2. 组件的插槽 3. 插槽的使用方法 4. 插槽的具名 5. 变量的作用域 6. slot的作用域 一. 什么是插槽呢? 1. 生活中的插槽有哪些呢? usb插槽, ...
- 组件:slot插槽
<!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...
- Vue结合slot插槽分发父组件内容实现高度复用、更加灵活的dialog组件
之前写过一篇关于vue实现dialog会话框组件的文章(http://www.cnblogs.com/fozero/p/8546883.html)[http://www.cnblogs.com/foz ...
- 使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件
写在前面 之前写过一篇关于vue实现dialog会话框组件的文章http://www.cnblogs.com/fozero/p/8546883.html, 讲到了如何实现一个vue对话框组件,其中涉及 ...
- 计算属性、侦听属性、局部与全局组件使用、组件通信(父子互传)、ref属性、动态组件和keep-alive、插槽
今日内容概要 计算属性 侦听属性 局部组件和全局组件 组件通信之父传子 组件通信之子传父 ref属性(组件间通信) 动态组件和keep-alive 插槽 内容详细 1.计算属性 # 插值的普通函数,只 ...
- Vue slot 插槽用法:自定义列表组件
Vue 框架的插槽(slot)功能相对于常用的 v-for, v-if 等指令使用频率少得多,但在实现可复用的自定义组件时十分有用.例如,如果经常使用前端组件库的话,就会经常看到类似的用法: < ...
- VUE 组件通信总结
1.prop 父组件传递给子组件,即通过VUE本身具有的Props属性来传递值 Child组件 <template> <span>{{message}}</span> ...
- Vue简单基础 + 实例 及 组件通信
vue的双向绑定原理:Object.defineProperty() vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...
随机推荐
- emacs第二天
setq 和setq-default的区别 cursor-type是一个buffer local 变量 在每一份buffer中都有一份值 如果变量是buffer local 里面的变量 setq-de ...
- mysql数据库锁的机制-one
锁概念 : 当高并发访问同一个资源时,可能会导致数据不一致,需要一种机制将用户访问数据的顺序进行规范化,以保证数据库数据的一致性.锁就是其中的一种机制. 举例 :以买火车票为例,火车票可面向广大消费者 ...
- freeradius client 和jradius安装编译
freeradius client radtest只是用来调试的,radclient功能更强大.用法如下: From the man page we can see that radclient gi ...
- TDD具体实施过程,可以看作两个层次
在代码层次,在编码之前写测试脚本,可以称为单元测试驱动开发(Unit Test Driven Development,UTDD) 在业务层次,在需求分析时就确定需求(如用户故事)的验收标准,即验收测试 ...
- redis 键值对 有效期设置
redis 键值对 有效期设置redis中可以使用expire命令设置一个键的生存时间, 到时间后redis会自动删除它<-----> 类比于javaweb系统临时数据 过期删除功能 ex ...
- Spring Security教程之退出登录logout(十)
要实现退出登录的功能我们需要在http元素下定义logout元素,这样Spring Security将自动为我们添加用于处理退出登录的过滤器LogoutFilter到FilterChain.当我们指定 ...
- Java编程思想之十八 枚举类型
关键字enum可以将一组具名的值的有限集合创建为一种新的类型, 而这些具名的值可以作为常规的程序组件使用.这是一种非常有用的功能. 18.1 基本enum特性 创建enum时,编译器会为你生成一个相关 ...
- 哈夫曼树的构建(C语言)
哈夫曼树的构建(C语言) 算法思路: 主要包括两部分算法,一个是在数组中找到权值最小.且无父结点两个结点位置,因为只有无父结点才能继续组成树: 另一个就是根据这两个结点来修改相关结点值. 结构定义 ...
- excel绘制多列 其中一列作为横坐标 ; 数值拟合
excel绘制多列,其中最左列作为横纵坐标: 选中很多列,然后,,点击菜单栏的“插入”->“图标” -->在弹出的“插入图表”对话框中选择“X Y(散点图)”,默认是条形图. 左边的列会 ...
- Apache信息头
package org.apache.http; public final class HttpHeaders { public static final String ACCEPT = " ...