返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue中插槽和过滤器的深入讲解
  • 291
分享到

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

2024-04-02 19:04:59 291人浏览 安东尼
摘要

目录插槽什么是插槽?插槽内容编译作用域后备内容具名插槽过滤器概念语法全局过滤器局部过滤器练习总结插槽 什么是插槽? 概念 Vue 实现了一套内容分发的 api,为组件提供了一个

插槽

什么是插槽?

概念

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 }}

  
</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插槽和过滤器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue中插槽和过滤器的深入讲解

本文链接: https://lsjlt.com/news/130134.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue中插槽和过滤器的深入讲解
    目录插槽什么是插槽?插槽内容编译作用域后备内容具名插槽过滤器概念语法全局过滤器局部过滤器练习总结插槽 什么是插槽? 概念 Vue 实现了一套内容分发的 API,为组件提供了一个 ...
    99+
    2024-04-02
  • Vue深入理解插槽slot的使用
    目录一、插槽(slot)是什么二、使用场景三、slot的分类默认插槽具名插槽作用域插槽四、介绍对slot的理解一、插槽(slot)是什么 slot是组件内的一个占位符,该占位符可以在...
    99+
    2022-11-13
    Vue slot Vue slot用法 Vue slot原理
  • Vueslot插槽作用与原理深入讲解
    目录前言什么是Slot栗子在插槽中使用数据备胎插槽具名插槽覆盖问题作用域插槽具名插槽的作用域解构插槽Prop具名插槽的缩写$scopedSlots前言 在2.6.0中,具名插槽 和 ...
    99+
    2023-01-17
    Vue slot插槽作用 Vue slot插槽原理 Vue slot插槽
  • vue中的插槽详解
    vue中代码的复用, 为我们提供了 mixnis. 模板的复用, 为我们提供了 插槽( slot ) 插槽的分类 默认插槽 具名插槽 作用域插槽 当我们的组件中 我们只需要插...
    99+
    2024-04-02
  • Vue中的匿名插槽与具名插槽详解
    目录1.匿名插槽2.具名插槽总结 slot又名插槽,是Vue的内容分发机制,组件内部的模板引擎使用slot元素作为承载分发内容的出口。 插槽slot是子组件的一个模板标签元素,而这一...
    99+
    2024-04-02
  • 浅析Vue中插槽Slot的作用和具名插槽
    一、插槽Slot1.1.插槽Slot的作用⭐⭐ 初识插槽:为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的div、span等等这些元素;【相关推荐:vuejs视频教程】比如某种情况下我们使用组件,希望组件显示的是一个按钮,...
    99+
    2022-11-22
    Vue vue3 vue.js 插槽
  • 深入了解Java中的过滤器Filter和监听器Listener
    目录Filter:过滤器概念快速入门过滤器细节Listener:监听器Filter:过滤器 概念 生活中的过滤器:净水器,空气净化器,土匪、 web中的过滤器:当访问服务器的资源时,...
    99+
    2024-04-02
  • Vue中的过滤器(filter)详解
    目录过滤器使用位置全局过滤器、局部过滤器 全局过滤器:局部过滤器:过滤器中传入多个参数:多个过滤器串联:官方文档:https://cn.vuejs.org/v2/guide...
    99+
    2022-11-13
    Vue中的过滤器 Vue filter过滤器 vue filter
  • 深入理解JavaWeb中过滤器与监听器的应用
    目录过滤器Filter过滤器声明过滤器生命周期监听器ListenerListener声明实例过滤器Filter Filter过滤器能够对匹配的请求到达目标之前或返回响应之后增加一些处...
    99+
    2023-05-20
    JavaWeb过滤器与监听器 JavaWeb过滤器 JavaWeb监听器
  • vue中的局部过滤器和全局过滤器代码实操
    v-model:绑定的value v-bind:绑定的type <html>   <head>       <script src="https://c...
    99+
    2024-04-02
  • 深入讲解Python中的迭代器和生成器
    在Python中,很多对象都是可以通过for语句来直接遍历的,例如list、string、dict等等,这些对象都可以被称为可迭代对象。至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了。 迭...
    99+
    2022-06-04
    生成器 迭代 Python
  • ECMAScript中迭代器的深入讲解
    目录前言较早的迭代 迭代器模式 迭代器工厂函数 迭代器协议 写在最后 前言 许多初级前端开发者在往中级迈进的过程中,面试经常问到的一个就是迭代器和生成器,其实在开发中都用过,但是并不...
    99+
    2024-04-02
  • vue中过滤器的用法
    一、过滤器 过滤器是vue中的一个特性,作用是用于对文本进行格式化的作用。 注意:在vue 1.0中有内置的过滤器,在2.0中去掉了内置过滤器,只有自定义过滤器 二、使用位置 过滤器...
    99+
    2024-04-02
  • vue单向数据流的深入讲解
    目录vue单向数据流代码示例特殊情况注意点:总结vue单向数据流 在vue中需要遵循单向数据流原则 在父传子的前提下,父组件的数据发生会通知子组件自动更新子组件内部,不能直接修改父组...
    99+
    2024-04-02
  • JavaWeb中Servlet的深入讲解
    Servlet 1 Servlet 简介 Servlet就是Sun 公司开发动态web的一门技术 Sun在这些API中提供一个接口叫做:Servlet ,如果你向开发一个Serv...
    99+
    2024-04-02
  • Redis中键的过期删除策略深入讲解
    如果一个键过期了,那么它什么时候会被删除呢? 这个问题有三种可能的答案,它们分别代表了三种不同的删除策略: 定时删除:在设置键的过期时间的同时,创建一个定时器( timer ). 让定时器...
    99+
    2024-04-02
  • Vue中匿名插槽与作用域插槽合并和覆盖行为的示例分析
    小编给大家分享一下Vue中匿名插槽与作用域插槽合并和覆盖行为的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Vue 测试...
    99+
    2024-04-02
  • js深拷贝和浅拷贝的深入讲解
    目录浅拷贝实现方法方法一:Object.assign方法二:扩展运算符方式方法三:concat和slice 浅拷贝数组深拷贝实现方法方法一:乞丐版(JSON.stringify和JS...
    99+
    2024-04-02
  • Vue的过滤器你真了解吗
    目录1.过滤器1.1对过滤器的理解1.2全局过滤器:1.3局部过滤器:1.4过滤器的案例总结1. 过滤器 案例中使用到时间格式相关API 1.1 对过滤器的理解 定义:对要显示的数据...
    99+
    2024-04-02
  • 一文详解Vue中过滤器filters的使用
    目录一、局部过滤器二、全局过滤器三、过滤器串联四、过滤器接收多个参数 Vue.js允许自定义过滤器,过滤器的作用可被用于一些常见的文本格式化(也就是修饰文本,但是文本内容不...
    99+
    2023-05-17
    Vue过滤器filters使用 Vue过滤器filters Vue过滤器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作