详解Vue中的无渲染行为插槽

详解Vue中的无渲染行为插槽

在本文中我们讨论 Vue 中的无渲染插槽模式能够帮助解决哪些问题。

在 Vue.js 2.3.0 中引入的作用域插槽显著提高了组件的可重用性。无渲染组件模式应运而生,解决了提供可重用行为和可插入表示的问题。

在这里,我们将会看到如何解决相反的问题:怎样提供可重用的外观和可插入的行为。

无渲染组件

这种模式适用于实现复杂行为且具有可自定义表示的组件。

立即学习“前端免费学习笔记(深入)”;

它满足以下功能:

该组件实现所有行为作用域的插槽负责渲染后备内容能够确保组件可以直接使用。

举个例子:一个执行 Ajax 请求并显示结果的插槽的组件。组件处理 Ajax 请求并加载状态,而默认插槽提供演示。

这是一个简化版的实现:

  
            
Loading ...
              
export default { props: ["url"], data: () => ({ loading: true, data: null }), async created() { this.data = await fetch(this.url); this.loading = false; }};

登录后复制

用法:

      
{{ data }}
  

登录后复制

有关这种模式的原始文章,请在这里查看。

一个相反的问题

如果问题反过来该怎么办:想象一下,如果一个组件的主要特征就是它的表示形式,另外它的行为应是可自定义的。

假设你想要基于 SVG 创建一个树组件,如下所示:

详解Vue中的无渲染行为插槽

你想要提供 SVG 的显示和行为,例如在单击时收回节点和突出显示文本。

当你打算不对这些行为进行硬编码,并且让组件的用户自由覆盖它们时,就会出现问题。

暴露这些行为的简单解决方案是向组件添加方法和事件。

你可能会这样去实现:

export default {  mounted() {    // pseudo code    nodes.on('click',(node) => this.$emit('click', node));  },  methods: {    expandNode(node) {      //...    },    retractNode(node) {      //...    },    highlightText(node) {      //...    },  }};

登录后复制

如果组件的使用者要向组件添加行为,需要在父组件中使用 ref,例如:

  export default {  methods: {    onClick(node) {      this.$refs.tree.retractNode(node);    }  }};

登录后复制

这种方法有几个缺点:

无法再提供默认行为行为代码最终会被频繁的复制粘贴行为不可重用

让我们看看无渲染插槽如何解决这些问题。

无渲染插槽

行为基本上包括证明对事件的反应。所以让我们创建一个插槽,用来接收对事件和组件方法的访问:

  
          
export default { methods: { expandNode(node) { }, retractNode(node) { }, //... }, computed:{ actions() { const {expandNode, retractNode} = this; return {expandNode, retractNode}; }, on() { return this.$on.bind(this); } }};

登录后复制

on 属性是父组件的 $on 方法,因此可以监听所有事件。

可以将行为实现为无渲染组件。接下来编写点击扩展组件:

export default {  props: ['on','action']  render: () => null,  created() {    this.on("click", (node) => {      this.actions.expandNode(node);    });  }};

登录后复制

用法:

        

登录后复制

该解决方案的主要优点是:

通过备用内容来提供默认行为的可能性:

例如,通过将图形组件声明为:

  
                

登录后复制能够创建可重用的组件,并可以实现使用这个组件的用户能够选择的标准行为

考虑一个悬停突出显示组件:

export default {  props: ['on','action']  render: () => null,  created() {    this.on("hover", (node) => {      this.actions.highlight(node);    });  }};

登录后复制

覆盖标准行为:

        

登录后复制行为插槽是可组合的

添加两个预定义的行为:

            

登录后复制解决方案的可读性

作为行为的组件是能够自描述的。

可扩展性

on 属性可以访问所有组件事件。默认情况下,该插槽可使用新事件。

总结

无渲染插槽提供了一种有趣的解决方案,可以在组件中公开方法和事件。它们提供了更具可读性和可重用性的代码。

可以在 github 上找到实现此模式的树组件的代码:在这里查看

英文地址原文:https://alligator.io/vuejs/renderless-behavior-slots/作者:David Desmaisons

相关推荐:

在这里查看

在这里查看

更多编程相关知识,请访问:在这里查看!!

以上就是详解Vue中的无渲染行为插槽的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3023140.html

(0)
上一篇 2025年3月13日 06:04:00
下一篇 2025年3月8日 07:12:53

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 了解一下Vue中的插槽

    Vue插槽,是学习vue中必不可少的一节,当初刚接触vue的时候,对这些掌握的一知半解,特别是作用域插槽一直没明白。 后面越来越发现插槽的好用。 分享一下插槽的一些知识吧。 一、插槽内容 立即学习“前端免费学习笔记(深入)”; 一句话:插槽…

    2025年3月13日 编程技术
    200
  • vue如何实现一个电子签名组件?

    在生活中我们使用到电子签名最多的地方可能就是银行了,每次都会让你留下大名。今天我们就要用vue实现一个电子签名的面板 想要绘制图形,第一步想到的就是使用canvas标签,在之前的文章里我们使用canvas实现了一个前端生成图形验证码的组件,…

    2025年3月13日
    200
  • 深入了解Vue自带的过滤器

    过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数。Vue有很多很便利的过滤器,本文为大家介绍了vue自带的9种过滤器,希望对大家有一定的帮助。 一、过滤器写法 {{ message | Filter}} 登录后复…

    2025年3月13日
    200
  • vue如何实现局部刷新?(代码示例)

    我们都知道,vue的组件化是他最强大的核心所在,路由也是特别可爱的一部分,但是路由适合一些大型的组件,看url路径的时候会出现变化,但是有时候我们想要一些小的局部小刷新,这个时候就需要用到它的动态组件了。 Vue 自身保留的  元素,可以将…

    2025年3月13日
    200
  • 详解vue中的数据初始化(initState)

    下面vue.js教程栏目带大家了解一下vue中的数据初始化(initstate)。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 数据初始化 Vue 实例在建立的时候会运行一系列的初始化操作,而在这些初始化操作里面,和数据…

    2025年3月13日
    200
  • 深入了解vue中的计算属性

    下面vue.js教程栏目带大家了解一下vue中的计算属性。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 一、什么是计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且…

    2025年3月13日
    200
  • 浅谈vue中axios的封装

    下面vue.js教程栏目带大家了解一下vue中axios的封装。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 vue中axios的封装 第一步还是先下载axios cnpm install axios -S 登录后复制 …

    2025年3月13日
    200
  • vue如何动态绑定class?方法介绍

    Vue.js 的核心是一个响应的数据绑定系统,它允许我们在普通 HTML 模板中使用特殊的语法将 DOM “绑定”到底层数据。 被绑定的DOM 将与数据保持同步,每当数据有改动,相应的DOM视图也会更新。基于这种特性,通过vue.js动态绑…

    2025年3月13日
    200
  • 详解Vue中动态添加类名的方法

    能够向组件添加动态类名是非常强大的功能。它使我们可以更轻松地编写自定义主题,根据组件的状态添加类,还可以编写依赖于样式的组件的不同变体。 添加动态类名与在组件中添加 prop :class=”classname”一样…

    2025年3月13日
    200
  • vue中递归组件的实现方法介绍(附实例:三级菜单)

    下面vue.js教程栏目通过实例制作一个三级菜单,来介绍vue中递归组件的实现方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 js里面有递归算法,同时,我们也可以利用props来实现vue模板的递归调用,但是前提是组…

    2025年3月13日
    200

发表回复

登录后才能评论