Vue中插槽和过滤器的深入讲解

目录
  • 插槽
    • 什么是插槽?
    • 插槽内容
    • 编译作用域
    • 后备内容
    • 具名插槽
  • 过滤器
    • 概念
    • 语法
    • 全局过滤器
    • 局部过滤器
    • 练习
  • 总结

插槽

什么是插槽?

概念

Vue 实现了一套内容分发的 API,为组件提供了一个 <slot> 元素作为承载分发内容的出口。

简单来说就是<slot> 元素作为组件模板之中的内容分发插槽。<slot> 元素自身将被替换。

插槽内容

语法

首先先新建一个文件来书写我们的slot

// slot.vue

<template>
  <div>
    <div>
      <!--分发内容的内容会被承载到这个slot标签位置 -->
      <slot></slot>
    </div>
    <p>账号: <input /></p>
    <p>密码: <input type="password" /></p>
    <button>登录</button>
  </div>
</template>

<script>
export default {};
</script>

<style>
</style>

然后我们在另一个组件中(SlotTest)使用

// SlotTest.vue

<template>
  <div>
    <slotCom>
        <h2>我是分发到slot的内容</h2>
    </slotCom>
  </div>
</template>

<script>
// 引入
import slotCom from "../views/slot";

export default {
  components: {
    slotCom
  },
}
</script>

<style>
</style>

从效果图(下图)中我们可以看到h2标签的那句话已经被渲染在了页面上,标签位置也对应上了slot.vue文件中的标签

注意

如果 <SlotTest> 的 template 中没有包含一个 <slot> 元素,则该组件对称标签内部的任何内容都会被抛弃。

编译作用域

当你想在一个插槽中使用数据时,例如:

<navigation-link url="/profile">
  Logged in as {{ user.name }}
</navigation-link>

该插槽跟模板的其它地方一样可以访问相同的实例 property (也就是相同的“作用域”),而不能访问 <navigation-link> 的作用域。例如 url 是访问不到的:

<navigation-link url="/profile">
  Clicking here will send you to: {{ url }}

  /*  这里的 `url` 会是 undefined,因为其 (指该插槽的) 内容是
      _传递给_ <navigation-link> 的而不是
      在 <navigation-link> 组件*内部*定义的。
  */
</navigation-link>

作为一条规则,请记住:

父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

后备内容

<slot> 元素内部可以设置后备内容,如果当前组件对称标签内部没有插入任何内容的话,组件最终会渲染后备内容。简单来说就是相当于插槽的默认值。
举例

// 一个按钮组件,设置后备内容为文字Submit
<button type="submit">
  <slot>Submit</slot>
</button>

// 当我在一个父级组件中使用 <submit-button> 并且不提供任何插槽内容时:
<submit-button></submit-button>

// 后备内容“Submit”将会被渲染:
<button type="submit">
  Submit
</button>

// 但是如果我们提供内容:
<submit-button>
  Save
</submit-button>

// 则这个提供的内容将会被渲染从而取代后备内容:
<button type="submit">
  Save
</button>

具名插槽

概念有时我们组件需要多个插槽。可以将不同的组件插入到不同插槽内部,实现方法是使用具名插槽,给组件中的<slot> 元素设置一个name属性。在向具名插槽提供内容的时候,我们可以在一个 <template> 元素上使用 v-slot 指令将对应的内容插入到指定的<slot> 元素上

语法

// login-component.vue

<template>
    <div>
        <div>
            <slot>后备内容</slot>
        </div>
        <p>
            账号: <slot name="user"></slot>
        </p>
        <p>
            密码: <slot name="psd"></slot>
        </p>

        <button>登录</button>
        <slot></slot>
    </div>
</template>

// 使用
<login-component>
        <h2>我是分发到slot的内容</h2>

        <template v-slot:user>
            <!-- 这里所有的内容都会被插入到name="user" 插槽中 -->
            <div>
                123
            </div>
        </template>

        <input slot="psd" type="password" placeholder="这个元素会被插入到name=psd 插槽中">
        <component-a slot="psd"></component-a> 

</login-component>

注意

跟 v-on 和 v-bind 一样,v-slot 也有缩写,即把参数之前的所有内容 (v-slot:) 替换为字符 #。例如 v-slot:header 可以被重写为 #header

<login-component>
            <h2>我是分发到slot的内容</h2>

            <template #user>
                这里所有的内容都会被插入到name="user" 插槽中
                <div>
                    123
                </div>
            </template>

            <template #psd>
               <input type="password" placeholder="这个元素会被插入到name=psd 插槽中">
            </template>
</login-component>

我个人觉得插槽在项目开发中不太常用,常用于一些UI库的开发。如果想对插槽有更深的了解可以查阅官方文档cn.vuejs.org/v2/guide/co

过滤器

概念

Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持)。过滤器应该被添加在 JavaScript 表达式的尾部,由“|”符号指示:

语法

filter支持全局过滤器或者局部过滤器

全局过滤器

<div id="app">
    {{str | capitalize}}  // Hello
</div>

// 单词首字母大写
Vue.filter('capitalize', function (value) {
  if (!value) return ''
  value = value.toString()
  return value.charAt(0).toUpperCase() + value.slice(1)
})

new Vue({
    el: '#app',
    data: {
        str: 'hello'
    }
})

局部过滤器

<div id="app">
    <div v-for="(f,i) in friends" :key="i">
        <h3>姓名: {{f.name}} </h2>
        <p>年龄: {{f.age}}</p>
        <p>性别: {{f.sex|getSex}}</p>
    </div>
</div>

<script>
    new Vue({
        el: '#app',
        data: {
            friends: [{
                    name: 'Max',
                    sex: 0,
                    age: 19
                },
                {
                    name: 'Jack',
                    sex: 1,
                    age: 22
                },
                {
                    name: 'Jacose',
                    sex: 1,
                    age: 19
                },
                {
                    name: 'Tim',
                    sex: 1,
                    age: 18
                },
                {
                    name: 'Jimmy',
                    sex: 0,
                    age: 20
                },
                {
                    name: 'Tom',
                    sex: 0,
                    age: 19
                },
            ]
        },
        filters: {
            getSex(type) {
                if (type === 0) {
                    return '男'
                }
                return '女'
            }
        }
    })
</script>

注意: filter支持传递多个参数,直接向substr传递的参数会依次作为filter方法的第二第三....个参数

<div>{{'hello' | substr(3,4)}}</div>
<script>
{
    filters: {
       substr(str,start,end) {
           return str.substr(start,end)
       }
    }
}
</script>

练习

实现一个过滤器,能够将时间戳字符串按照指定的模板返回对应结构的时间

// 例

<p>{1599639292100 | getTemplateTimeByDate('YYYY-MM-dd hh:mm:ss')}</p> -> 2020-09-09 15:04:56

<p>{1599639292100 | getTemplateTimeByDate('YYYY-M-d h:m:s')}</p> -> 2020-9-9 15:4:6
<p>{1599639292100 | getTemplateTimeByDate('YYYY年M月d日 hh:mm')}</p> -> 2020年9年9 15:04

new Vue({
    el: '#app',
    data: {
        date: new Date().getTime()
    },
    filters: {
        getTemplateTimeByDate(date, template) {
            date = new Date(date)

            let TimeObj = {
                'Y+': date.getFullYear(),
                '(M+)': date.getMonth() + 1,
                '(d+)': date.getDate(),
                '(h+)': date.getHours(),
                '(m+)': date.getMinutes(),
                '(s+)': date.getSeconds()
            }

            for (key in TimeObj) {
                let reg = new RegExp(key)

                if (reg.test(template)) {
                    console.log(RegExp.$1)
                    let time = TimeObj[key]
                    // 判断当前模板时间是 两位 还是 一位的
                    // 如果是两位 个位数时间需要前面加零, 1 -> 01
                    // 如果是一位 不用加零操作
                    if (RegExp.$1.length > 1) {

                        time = time >= 10 ? time : '0' + time
                    }
                    template = template.replace(reg, time)
                }
            }
            return template
        }
    }
})
</script>

总结

到此这篇关于Vue中插槽和过滤器的文章就介绍到这了,更多相关Vue插槽和过滤器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue.js每天必学之过滤器与自定义过滤器

    基础 类似于自定义指令,可以用全局方法 Vue.filter() 注册一个自定义过滤器,它接收两个参数:过滤器 ID 和过滤器函数.过滤器函数以值为参数,返回转换后的值: Vue.filter('reverse', function (value) { return value.split('').reverse().join('') }) <!-- 'abc' => 'cba' --> <span v-text="message | reverse">&

  • 详解Vue组件插槽的使用以及调用组件内的方法

    组件传参 通过给组件传递参数, 可以让组件变得更加可扩展, 组件内使用props接收参数 export default { props: ['options'], data(){ return {} } } 但是这个方法有局限性, 例如我写了一个对话框组件, 对话框的内容是自定义的 如果我只是显示文字的话, 我可以简单的将字符串传进去props: ['message'] 但是如果需要在其中添加一个按钮的话, 这种方法就显得很笨重了, 所以我们用另一种办法 插槽 slot 插槽 slot的使用就像

  • 详解vue slot插槽的使用方法

    官方文档其实已经讲得很详细,我根据文档,把官方的小案例实现了一下,这样更直观 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://unpkg.com/vue@2.3.3/dist/vue.js"><

  • vue中的 $slot 获取插槽的节点实例

    vue 中的 $slot 以前一直不知到这个东西,后来发现 vue api 中 藏着很多的 很神奇的 api,比如这个 具名插槽很好理解,但是那个 default 就有点难了, 写了一个炒鸡简单的 demo father: <template> <div> <button @click="getSlot">getSlot</button> <try ref="try"> <div class=&quo

  • vue插槽slot的理解和使用方法

    前言 Vue的slot插槽,可以从字面意思来了解用途,占用占坑的意思,既然是占坑肯定是先占坑后面有其他具体的内容来替换代替.根据slot的应用场景可以分为匿名slot和具名slot. 一.个人理解及插槽的使用场景 刚开始看教程我的疑惑是为什么要用插槽,它的使用场景是什么,很多解释都是"父组件向子组件传递dom时会用到插槽",这并不能很好的解决我的疑惑.既然你用了子组件,你为什么要给她传一些dom,直接去定义复用的子组件不就好了.后来想想觉得一个复用的组件在不同的地方只有些许变化,如果去

  • Vue 过滤器filters及基本用法

    1.示例代码 采用vue单文件组件,使用moment插件格式化日期 <template> <div> <h1>{{date | dateFormat}}</h1> </div> </template> <script> import moment from 'moment'; import 'moment/locale/zh-cn'; moment.locale('zh-cn'); export default { dat

  • Vue.js -- 过滤器使用总结

    过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数.Vue有很多很便利的过滤器,过滤器通常会使用管道标志 " | ", 比如: {{ msg | capitalize }} // 'abc' => 'ABC' uppercase过滤器 : 将输入的字符串转换成大写字母的过滤器. VueJs允许你链式调用过滤器,简单的来说,就是一个过滤器的输出成为下一个过滤器的输入,然后再次过滤.接下来,我们可以想象一个比较简单的例子,使用了Vue的 filterBy +

  • Vue插槽原理与用法详解

    本文实例讲述了Vue插槽原理与用法.分享给大家供大家参考,具体如下: 1 插槽内容 Vue 实现了一套内容分发的 API,这套 API 基于当前的 Web Components 规范草案,将 <slot> 元素作为承载分发内容的出口. 它允许你像这样合成组件: <div id="app1"> <navigation-link url="/profile"> Your Profile </navigation-link>

  • vue中slot(插槽)的介绍与使用

    什么是插槽? 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性.插槽显不显示.怎样显示是由父组件来控制的,而插槽在哪里显示就由子组件来进行控制 Vue slot 原理 在web-components中有slot的概念,https://developers.google.com/web/fundamentals/web-components/shadowdom. <slot> 元素 Shado

  • Vue中插槽和过滤器的深入讲解

    目录 插槽 什么是插槽? 插槽内容 编译作用域 后备内容 具名插槽 过滤器 概念 语法 全局过滤器 局部过滤器 练习 总结 插槽 什么是插槽? 概念 Vue 实现了一套内容分发的 API,为组件提供了一个 <slot> 元素作为承载分发内容的出口. 简单来说就是<slot> 元素作为组件模板之中的内容分发插槽.<slot> 元素自身将被替换. 插槽内容 语法 首先先新建一个文件来书写我们的slot // slot.vue <template> <div

  • Vue slot插槽作用与原理深入讲解

    目录 前言 什么是Slot 栗子 在插槽中使用数据 备胎插槽 具名插槽 覆盖问题 作用域插槽 具名插槽的作用域 解构插槽Prop 具名插槽的缩写 $scopedSlots 前言 在2.6.0中,具名插槽 和 作用域插槽 引入了一个新的统一的语法 (即v-slot 指令).它取代了 slot 和 slot-scope. 什么是Slot 当我们生成好组件模板后,为了方便用户在调用组件的时候自定义组件内部分元素的样式或内容.于是在设计组件模板的时候会挖一个坑,等待用户使用v-slot来替换坑的slot

  • Vue中插槽slot的使用方法与应用场景详析

    什么是插槽? 我们知道在Vue中 Child 组件的标签 的中间是不可以包着什么的 . 可是往往在很多时候我们在使用组件的时候总想在组件间外面自定义一些标签,vue新增了一种插槽机制,叫做作用域插槽.要求的版本是2.1.0+: 插槽,其实就相当于占位符.它在组件中给你的HTML模板占了一个位置,让你来传入一些东西.插槽又分为 匿名插槽.具名插槽.作用域插槽. 在 2.6.0 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令).它取代了 slot 和 slot-sc

  • 浅谈Vue中插槽slot的使用方法

    如何定义和使用: 在组件的template中使用slot标签定义,slot标签中间可以定义默认显示值,如果slot标签没有声明name属性值,在使用插槽时将默认从第一个插槽依次往下放置,为了方便使用,一般都会都插槽slot指定一个name属性值,当要使用该插槽时,只需要在要使用的标签内添加slot='插槽名字',就可以将指定的标签放到指定的插槽内,插槽内可以是任意内容. 举例: <!DOCTYPE html> <html lang="en"> <head&

  • vue中插槽整理及用法分析

    本教程操作环境:windows7系统.vue2.9.6版,DELL G3电脑. vue的插槽(slot)主要分三种: 默认插槽,具名插槽,作用域插槽 vue中的插槽,指的是子组件中提供给父组件使用的一个占位符: 用标签表示,父组件可以在这个占位符中填充任何模板代码,比如HTML.组件等,填充的内容会替换掉子组件的标签(替换占位符). 默认插槽 默认插槽是最简单的一种插槽,和上面的描述一致,就是通过替换占位符达到在父组件中更改子组件中内容的效果. 语法: 在子组件中放置一个占位符(slot): <

  • Vue 中插槽的使用总结

    目录 默认插槽 具名插槽 作用域插槽 插槽总结 默认插槽 首先做一个页面: 新增 Category.vue <template> <div class="category">   <h3>{{title}}分类</h3>   <ul>     <li v-for="(item,index) in listData" :key="index">{{item}}</li&g

  • 关于vue中计算属性computed的详细讲解

    目录 1.定义 2.用法 3.computed的响应式依赖(缓存) 4.应用场景 附:计算属性的 getter 与 setter 总结 1.定义 computed是vue的计算属性,是根据依赖关系进行缓存的计算,只有在它的相关依赖发生改变时才会进行更新 2.用法 一般情况下,computed默认使用的是getter属性 3.computed的响应式依赖(缓存) 1. computed的每一个计算属性都会被缓存起来,只要计算属性所依赖的属性发生变化,计算属性就会重新执行,视图也会更新.下面代码中,

  • Vue中插槽Slot基本使用与具名插槽详解

    目录 一.插槽Slot 1.1.插槽Slot的作用 1.2.具名插槽Slot Ps:作用域插槽 总结 一.插槽Slot 1.1.插槽Slot的作用 初识插槽: 为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的div.span等等这些元素: 比如某种情况下我们使用组件,希望组件显示的是一个按钮,某种情况下我们使用组件希望显示的是一张图片: 我们应该让使用者可以决定某一块区域到底存放什么内容和元素: 所以就可以使用插槽来解决这个问题 换句话说就是,我们要是想在一个组件标签中添加新的

  • Vue中插槽slot的使用方法

    目录 1.什么是插槽 2.插槽的使用 3.v-slot指令 4.具名插槽 5.具名插槽的简写形式 6.作用域插槽 7.解构插槽 Prop 1.什么是插槽 插槽(slot)是 vue 为组件的封装者提供的能力.允许开发者在封装组件时,把不确定的.希望由用户 指定的部分定义为插槽. 2.插槽的使用 在封装组件时,可以通过 元素定义插槽,从而为用户预留内容占位符. // 子组件 <template> <div class="left-container"> <h

  • VUE中的自定义指令钩子函数讲解

    目录 自定义指令钩子函数 自定义指令 先上官方解释 小贴士 钩子函数运行顺序 自定义指令钩子函数 自定义指令 除了VUE 内置指令外,VUE也支持我们自定义注册指令,分为局部和全局注册 但这些想必大家都不陌生,其中官方API也是写的明明白白 官方API点这里 而且自定义指令也会极大程度上帮助我们日常的编程,但这是很有意思的事情出现了,就是钩子函数,很多老铁都弄不明白这五个函数的具体区别 先上官方解释 bind:只调用一次,指令第一次绑定到元素时调用.在这里可以进行一次性的初始化设置. inser

随机推荐