具名插槽、作用域插槽的新写法

插槽

  1. 具名插槽

    自 2.6.0 起有所更新。已废弃的使用 slot attribute 的语法

    但是我们有了新的语法,如下:

    子组件 childCom:

    <template id="childCom">
      <div>
        <!-- 具名插槽的针对于组件中不止一个插槽的情况下使用,使用方式,即:给每个插槽指定 name 属性,在使用的时候需要给标签设置 slot 属性,且属性值为 对应的 name 属性的属性值 -->
        <slot name='left'><span>左边</span></slot> <!--给每个插槽命名,插槽中间是默认内容-->
        <slot name='center'><span>中间</span></slot>
        <slot name='right'><span>右边</span></slot>
      </div>
    </template>

    父组件 app:

    <div id="app">
      <cpn></cpn>
      <!-- 2.6.0更新后的插槽使用方式发生了变化 -->
      <!-- 区别在于调动的时候是使用 v-slot:具体名称,而不是定义一个 slot='具体名称' 这样的属性 -->
      <cpn>
       <!-- 注意:2.6.0 之后的这个写法中,v-slot:具体名称 只能写在 template 标签中,而废弃的写法可以写在某个具体的标签上面 -->
       <template v-slot:center>  <!-- 指明使用的是哪个插槽 -->
          用户名:<input type="text">
       </template>
      </cpn>
    </div>

    效果图:

    注意: v-slot 只能添加在 template

  2. 作用域插槽

    有时让插槽内容能够访问子组件中才有的数据是很有用的。但是由于子组件的作用域在子组件,而父组件的作用域在父组件,这样一来,父组件就访问不到子组件的信息了,但是我们又不想用$emit发送事件去传递信息,这个时候可以用作用域插槽来实现。注意:你不要以为这又是父传子的一种方式,因为这种方法仅限于在使用插槽的时候才有用,话不多说,看代码:

    vm实例:

    <script>
      var vm = new Vue({
        el: '#app',
        data: {},
        methods: {},
        components: {
          cpn: {
            template: '#cpn',
            data() {
              return {
                list: ['coderlyl', 'tom' , 'mack']
              }
            },
          }
        }
      });
    </script>

    子组件 childCom:

    <template id="cpn">
      <div>
        <slot :coderlyl='list'>
        <!--list是子组件data中的数据,coderlyl是自己命名的变量,前面还有v-bind绑定-->
          <ul>
            <li v-for="(item, index) in list" :key="index">{{item}}</li>
          </ul>
        </slot>
      </div>
    </template>

    父组件 app:

    <div id="app">
      <cpn></cpn>
    
      <cpn>
        <template v-slot='lyl'>  <!--这里的lyl也是自己命名的-->
          <span>{{lyl.coderlyl.join('--')}}</span>
        </template>
      </cpn>
    </div>

    效果图:

处理边界情况

  1. $root 用来访问根组件
  2. $parent 用来从一个子组件访问父组件的实例
  3. ref$refs 的用法

    在组件上面使用 ref 这个属性绑定,属性值自取,然后就可以通过 $refs.属性名 这种方式去获取到指定组件的实例了。

    其实不仅仅是组件能够使用 ref ,标签元素也能使用。

  4. 依赖注入

    现在我们有一个需求,如果我们存在多个组件嵌套的,然后现在其中某一个组件想访问其曾祖父组件的方法,那么使用上面两种方式都是不可取的,这个时候官方提供了 provideinject 这两个属性来解决这个问题。

    • provide 允许我们指定想要提供给后代组件的数据/方法,且该属性是一个方法,返回一个对象,键名就是我们要传到后代组件的标志
    • 然后在任何后代组件里,我们都可以使用 inject 选项来接收指定的我们想要添加在这个实例上的属性。该属性是一个数组类型,跟 props 的数组语法类似

    说到这里,有的人可能会觉得这不就是跟 props 差不多嘛。没错,它确实差不多,但是还是有区别的,比如,祖先元素不需要知道哪些后代组件使用它提供的属性;其次,后代组件也不需要知道被注入的属性来自哪里

    代码如下:

    父组件:

    <div id="app">
      <child-com></child-com>
    </div>
    
    <template id="childCom">
      <div>
        <span>我是子组件</span>
        <grand-com></grand-com>
      </div>
    </template>
    
    <template id="grandCom">
      <div>
        <span>我是孙子组件</span>
        <button @click='btnClick'>孙子组件按钮</button>
        <h2>{{mess}}</h2>
      </div>
    </template>
    
    <script>
      const vm = new Vue({
        el: '#app',      //  父组件
        methods: {
          sendMessage() {
            return '我发送了信息'
          }
        },
        provide() {  //  注意这里的 provide属性
          return {
            sendMess: this.sendMessage()  //  提供给后代了一个方法
          }
        },
        components: {
          childCom: {
            template: '#childCom',   //  子组件
            components: {
              grandCom: {
                template: '#grandCom',   //  孙子组件
                inject: ['sendMess'],    //  注意这里的 inject属性
                data() {
                  return {
                    mess: ''
                  }
                },
                methods: {
                  btnClick() {
                    this.mess = this.sendMess //  孙子组件用了这个方法
                  }
                },
              }
            }
          }
        }
      })
    </script>

    效果图:

原文地址:https://www.cnblogs.com/liuyilong/p/12215587.html

时间: 2024-08-30 06:46:01

具名插槽、作用域插槽的新写法的相关文章

新版本的作用域插槽以及旧版本的slot

新版本的作用域插槽以及旧版本的slot 1.作用/概念:预先将使用的内容进行保留 我的理解就是父页面在组件标签内插入任意内容,子组件内插糟slot控制摆放位置(匿名插槽,具名插槽) 案例: <body> <div id='app'> <Hello> <div> 这里是插入的内容 //这一部分的内容并不会被输出(原因是被组件覆盖掉了) </div> </Hello> </div> <template id="

436 vue slot:插槽基本使用,具名插槽,作用域插槽

1. 插槽 : 替换内容 / 分发内容 (1)占位,像出口<router-view></router-view>. (2)没有新的内容放进来,就用默认的. (3)<slot></slot>将被替换成组件内的对应子节点. 2. 基本使用 <el-car> <div>宝马发动机</div> </el-car> 组件的内部 02-插槽的基本使用.html <!DOCTYPE html> <html

[干货]关于vue作用域插槽的新的深入理解

父级组件 <template> <div class="wrapper"> <son1 title="标题3" :content="listData3" @father="teClick"> <template v-slot="scope"> <b class="qianz">{{scope.item.prefix ? '有前缀

vue 作用域插槽

作用域插槽 作用域插件的目的就是:获取本组件的数据!. 示例代码todo-list组件: <ul> <li v-for="todo in filteredTodos" v-bind:key="todo.id" > <!-- 我们为每个 todo 准备了一个插槽, 将 `todo` 对象作为一个插槽的 prop 传入. --> <slot name="todo" v-bind:todo="todo

使用slot分发内容 作用域插槽

除非子组件模板包含至少一个<slot>插口,否则父组件的内容将会别丢弃.当子组件模板只有一个没有属性的slot时,父组件整个内容片断将插入到slot所在的DOM位置,并替换掉slot标签本身. 最初在 <slot> 标签中的任何内容都被视为备用内容.备用内容在子组件的作用域内编译,并且只有在宿主元素为空,且没有要插入的内容时才显示备用内容. 作用域插槽是一种特殊类型的插槽,用作使用一个(能够传递数据到)可重用模板替换已渲染元素. 在子组件中,只需将数据传递到插槽,就像你将 prop

vue2.1.x 新增作用域插槽

1.定义: 作用域插槽是一种特殊类型的插槽,用作使用一个(能够传递数据到)到可重用模板替换已渲染元素. 在子组件中,只需将数据传递到插槽,就像你将props传递给组件一样. 注:在父级中,具有特殊属性scope的<template>元素,表示他是作用域插槽的模板.scope的值对应一个临时变量名,此变量接收从子组件中传递的prop对象: 实例如下: 实例的输出结果为: 2.作用域插槽更具代表性的用例是列表组件,允许组件自定义应该如何渲染列表每一项: 输出结果为: 其实质是在不同的作用域内进行传

Vue组件之作用域插槽

写作用域插槽之前,先介绍一下Vue中的slot内容分发: 如果<child-component></child-component>标签之间没有插入那两个p标签的话,页面会显示子组件模板中定义的"<p>父组件如果没有插入内容,我将被显示</p>"这一则内容,但如果<child-component></child-component>标签之间有插入内容的话,则子组件模板中的<slot></slot&

细说Vue作用域插槽,匹配应用场景。

最近在官方文档中看到,vue新增了一种插槽机制,叫做作用域插槽.要求的版本是2.1.0+. 首先来说一下:顾名思义,所谓作用域插槽,主要就在作用域,需要注意的是(以下几点看不懂不要紧,配合下面的例子,你会一看就懂): 1. 组件中的slot标签只能有有一个,而这一个slot用于替代组件调用时的多个标签.即一个slot代替一组范围的标签,即为作用域. 2. 作用域插槽的特殊在于:可在上层作用域中通过临时变量拿到组件定义时通过作用域插槽传递的数据. 3. 作用域插槽的技巧在于:可在上层作用域中通过拿

vue中插槽作用域的使用

一.插槽作用域 1.简单来说就是带参数的插槽: 2.使用方式: 在组件标签内部加一个template标签 在template标签上加一个属性scope 值随意书写 在组件内部用slot进行接受,如果给slot加一个自定义属性,那么在组件标签的template的scope上面就可以进行接受到. 3.例父组件 App.vue 中 <template> <div id="app"> <header-com> <template scope="