vue render 渲染函数

经常看到使用render渲染函数的示例,而且在一些特殊情况下,确实更好使用,可以更加有效地细分组件,因而借助vue-element-admin来学习一波

render函数分析

  • 函数式组件
  • 基础的使用方式

针对 Link.vue进行改造

Link.vue

  1. // https://github.com/vuejs/eslint-plugin-vue/issues/462
  2. <template>
  3. <!-- eslint-disable vue/require-component-is -->
  4. <component v-bind="linkProps(to)">
  5. <slot />
  6. </component>
  7. </template>
  8. <script>
  9. import { isExternal } from '@/utils/validate'
  10. export default {
  11. props: {
  12. to: {
  13. type: String,
  14. required: true
  15. }
  16. },
  17. methods: {
  18. linkProps(url) {
  19. if (isExternal(url)) {
  20. return {
  21. is: 'a',
  22. href: url,
  23. target: '_blank',
  24. rel: 'noopener'
  25. }
  26. }
  27. return {
  28. is: 'router-link',
  29. to: url
  30. }
  31. }
  32. }
  33. }
  34. </script>

上述方式打开了一个新的使用方式,这样的好处,不需要使用if/else进行处理,还可以减少一个多余的标签【root element】。但是会有一些语法提示错误,虽然添加了eslint-disable来禁止,但还是不行,而且有些不似vue的用法

改造开始

  • 版本一 非函数式组件 【Link.vue】
  1. <script>
  2. import { isExternal } from '@/utils/validate'
  3. export default {
  4. name: 'Link',
  5. props: {
  6. to: {
  7. type: String,
  8. required: true
  9. }
  10. },
  11. render(h) {
  12. if (isExternal(this.to)) {
  13. return h(
  14. 'a',
  15. {
  16. attrs: {
  17. target: '_blank',
  18. rel: 'noopener',
  19. href: this.to
  20. }
  21. },
  22. this.$slots.default
  23. )
  24. } else {
  25. return h('router-link',
  26. {
  27. props: {
  28. to: this.to
  29. }
  30. },
  31. this.$slots.default
  32. )
  33. }
  34. }
  35. }
  36. </script>

主要是slot如何处置比较好,其他都好处理,而且使用slot有两种方式 插槽

方式一

  1. this.$slots.default

方式二

  1. this.$scopedSlots.default()
  • 版本二 函数式组件 【Link.vue】
  1. <script>
  2. import { isExternal } from '@/utils/validate'
  3. export default {
  4. name: 'Link',
  5. functional: true,
  6. props: {
  7. to: {
  8. type: String,
  9. required: true
  10. }
  11. },
  12. render(h, context) {
  13. console.log(context)
  14. const { props, scopedSlots } = context
  15. const { to } = props
  16. if (isExternal(to)) {
  17. return h(
  18. 'a',
  19. {
  20. attrs: {
  21. target: '_blank',
  22. rel: 'noopener',
  23. href: to
  24. }
  25. },
  26. scopedSlots.default()
  27. )
  28. } else {
  29. return h('router-link',
  30. {
  31. props: {
  32. to: to
  33. }
  34. },
  35. // scopedSlots.default()
  36. context.children
  37. )
  38. }
  39. }
  40. }
  41. </script>

对于上述两种实现方式,大致相同,有一些细节需要注意

  • functional: true 添加这个后,只能通过 context来进行上下文关联,而无法调用this,同时这种方式会快一些,只是在使用slot时,会有两种形式link

    • this.$slots.default 更新为 context.children
    • scopedSlots.default() 这种方式依旧在
  • 当时用functional: true,文件名便可以改为js为后缀了,若依旧使用vue时,便需要<script> export default {}</script> 进行包裹了

总结

  • render函数更多是,很多细节不能使用语法糖来进行处理,导致使用起来不顺手
  • slot插槽这块还是很有用的,只是文档说明等没有前面的那么详细了
  • 通过上述方式,便发现原来可以这么玩,而且细粒度已经都要一层标签了,若使用原来的方式,root element怕是就够处理好一会儿了

vue render 渲染函数的更多相关文章

  1. 理解Vue中的Render渲染函数

    理解Vue中的Render渲染函数 VUE一般使用template来创建HTML,然后在有的时候,我们需要使用javascript来创建html,这时候我们需要使用render函数.比如如下我想要实现 ...

  2. Vue.js 2.x render 渲染函数 & JSX

    Vue.js 2.x render 渲染函数 & JSX Vue绝大多数情况下使用template创建 HTML.但是比如一些重复性比较高的场景,需要运用 JavaScript 的完全编程能力 ...

  3. Render渲染函数和JSX

    1.Render函数:render是用来替换temlate的,需要更灵活的模板的写法的时候,用render. 官网API地址:https://cn.vuejs.org/v2/guide/render- ...

  4. 基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table

    基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table https://segmentfault.com/a/1190000015970367

  5. Vue.js 渲染函数, JSX(未掌握,未学完)

    渲染函数 , JSX(没完成学习) 基础: 实例属性:vm.$slots default 属性包括了所有没有被包含在具名插槽中的节点. 渲染函数: render: function(createEle ...

  6. Vue基础-渲染函数-插槽

    Vue 测试版本:Vue.js v2.5.13 先看个插槽的例子: <div id="app"> <child > <span slot-scope= ...

  7. Vue之render渲染函数和JSX的应用

    一.模板缺陷 模板的最大特点是扩展难度大,不易扩展.可能会造成逻辑冗余 <Level :type="1">哈哈</Level> <Level :typ ...

  8. 必备技能三、render渲染函数

    Vue 推荐使用在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template ...

  9. Vue基础-渲染函数-父子组件-传递数据

    Vue 测试版本:Vue.js v2.5.13 做了个 demo,把父子组件的数据都绑定到 Vue 实例 app 上,注释中的 template 相对好理解些 <div id="app ...

随机推荐

  1. 51nod-1640--天气晴朗的魔法(简单最小生成树)

    1640 天气晴朗的魔法 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 这样阴沉的天气持续下去,我们不免担心起他的健康. 51nod魔法学校近日 ...

  2. [笔记]makefile编写

    makefile的隐含规则默认处理第一个目标 函数:wildcard可以进行文本匹配 patsubst内容替换 变量: $@代表目标 $^  代表全部依赖 $<  第一个依赖 $?   第一个变 ...

  3. Java常考面试题整理(二)

    21.Iterator和ListIterator的区别是什么? 参考答案: 下面列出了他们的区别: Iterator可以用来遍历Set和List集合,但是ListIterator只能用来遍历List. ...

  4. axios 的用法解析

    axios 的非常好的请求数据方式,利用了 promise 的方式来进行的操作 首先 promise 是非常好的处理 异步请求的方式,且拥有高并发请求的能力 并发请求:出现大量的异步请求后,一起处理 ...

  5. moment 时间格式化

    使用方法: 引入 moment 的包 moment(要处理的时间).format(时间的格式): vue 的过滤器为例: str 代表要处理的时间  orf 代表 时间的格式

  6. Laravel 在构造方法中使用session

  7. vue问题四:富文本编辑器上传图片

    vue使用富文本编辑器上传图片: 我是用的是wangEditor 富文本编辑器 demo:http://www.wangeditor.com/ 1).安装依赖:npm install wangedit ...

  8. 国际标准 ISO 15008

    Road vehicles — Ergonomic aspects of transport information and control systems — Specifications and ...

  9. sklearn.feature_extraction.DictVectorizer

    sklearn.feature_extraction.DictVectorizer:将字典组成的列表转换成向量.(将特征与值的映射字典组成的列表转换成向量) 1. 特征矩阵行代表数据,列代表特征,0表 ...

  10. flask url_for后没有带端口号

    问题描述: 在本地运行flask项目,当运行到下面这句代码时,正常重定向 return redirect(url_for('.script_case')) 但项目布署到服务器之后,代码运行一这句话,却 ...