赞
踩
我们知道Vue
是一款流行的JavaScript
前端框架。绝大多数情况下我们都是使用模板template
来创建 HTML
( 这也是Vue
的推荐写法),然后Vue
将模板中的代码进行编译,经过渲染函数转换成vnode
树,也就是我们常说的虚拟DOM。
如下图所示:
图例来源:Vue-render函数的应用与原理浅析
从中我们可以看出,渲染函数 render
比模板 template
更接近底层
。所以有些情况下你可以直接使用渲染函数 render
。
JavaScript
写组件的方式常见的是在被用来写自定义组件。
渲染函数顾名思义它就是个函数,而且它的作用就是生成
vnode
数,且实现方式更接近于底层,那么有些组件我们可能为了方便或者性能考虑,就可以直接使用渲染函数实现。
一个函数式组件就像这样:
Vue.component('my-component', {
// 意味它无状态 (没有响应式数据) 也没有实例 (没有 this 上下文)
functional: true,
// Props 是可选的
props: {
// ...
},
// 为了弥补缺少的实例
// 提供第二个参数作为上下文
render: function (createElement, context) {
// ...
}
})
那么我们如何去使用渲染函数呢?
我们定义render-function-demo.js
函数式组件。
export default {
name: "AnchoredHeading",
render: function (createElement, context) {
return createElement(
"h" + this.level, // 标签名称
this.$slots.default // 子节点数组
);
},
props: {
level: {
type: Number,
required: true
}
}
};
然后在render-demo.vue
中使用
<template> <div class="container"> <AnchoredHeading :level="1">222</AnchoredHeading> </div> </template> <script> import AnchoredHeading from "./render-function-demo"; export default { name: "RenderDemo", components: { AnchoredHeading }, data() { return {}; }, methods: {}, }; </script>
关于createdElement
的更多参数介绍,请查看【官方文档】
JSX
是一种Javascript
的语法扩展,JSX = Javascript + XML
,即在JavaScript
里面写XML
,因为JSX
的这个特性,所以他即具备了Javascript
的灵活性,同时又兼具HTML
的语义化和直观性。
一般我们使用Vue
提供的模板template
开发就满足大部分场景了。但是有时候,我们会使用渲染函数来抽象组件,而渲染函数有时候写起来是非常痛苦的。
这个时候就派上 JSX
上场了。
使用JSX
需要配合jsx-vue2
插件
先安装相关依赖
npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props
然后在babel.config.js:
中增加如下代码
module.exports = {
presets: ['@vue/babel-preset-jsx'],
}
接下来就可以愉快的使用JSX
语法了
我们先定义一个render-jsx-demo.js
export default {
name: 'RenderJSXDemo',
render() {
return <p>hello</p>
}
}
然后在组件中引入使用即可看到效果。
<template>
<div>
<RenderJSXDemo style="color:#333333" />
</div>
</template>
<script>
import RenderJSXDemo from '@/jsx/render-jsx-demo'
export default {
components: {
RenderJSXDemo
},
关于JSX
语法的使用,请查看【官方文档】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。