ros激光雷达测距velodyne(vue3中如何使用JSX?)
在绝大多数情况下 ,Vue 推荐使用模板<template>语法来创建应用 。
在 Vue 3 的项目开发中 ,template 是 Vue 3 默认的写法 。虽然 template 长得很像 HTML ,但 Vue 其实会把 template 解析为 render 函数 ,之后 ,组件运行的时候通过 render 函数去返回虚拟 DOM 。
然而在某些使用场景下 ,我们真的需要用到 JavaScript 完全的编程能力 。这时渲染函数就派上用场了 。
h函数
Vue 提供了一个 h() 函数用于创建 vnodes虚拟dom 。如下示例:
import { h } from vue const vnode = h(div, // type{ id: foo, class: bar }, // props[/* children */] )在组件中如何使用呢?
之前当组合式 API 与模板一起使用时 ,setup() 钩子的返回值是用于暴露数据给模板 。但是当使用h()的时候 ,setup() 钩子返回的是渲染函数:
import { ref, h } from vue export default {props: {/* ... */},setup(props) {const count = ref(1)// 返回渲染函数return () => h(div, props.msg + count.value)} }手写的 h 函数 ,可以处理动态性更高的场景 。但是如果是复杂的场景 ,h 函数写起来就显得非常繁琐 ,需要自己把所有的属性都转变成对象 。并且组件嵌套的时候 ,对象也会变得非常复杂 。不过,因为 h 函数也是返回虚拟 DOM 的 ,所以有没有更方便的方式去写 h 函数呢?答案是肯定的 ,这个方式就是 JSX 。
JSX
JSX 是 JavaScript 的一个类似 XML 的扩展,有了它 ,我们可以用简单方式来创建vnodes:
const vnode = <div id="app">hello</div>这种在 JavaScript 里面写 HTML 的语法 ,就叫做 JSX ,算是对 JavaScript 语法的一个扩展 。上面的代码直接在 JavaScript 环境中运行时 ,会报错。JSX 的本质就是下面代码的语法糖 。
const vnode = createVnode(div,{id:"app"}, hello)其实h 函数内部也是调用 createVnode 来返回虚拟 DOM 。
那么 ,如何在Vue项目中使用JSX呢?
默认的情况下 ,vue3+vite的项目不支持jsx ,如果想支持jsx ,需要安装插件@vitejs/plugin-vue-jsx
安装
npm i @vitejs/plugin-vue-jsx -D在vite.config.js中进行配置:
import vueJsx from "@vitejs/plugin-vue-jsx"; // 配置vue使用jsx export default defineConfig({plugins: [vue(), vueJsx()], });然后就可以在Vue组件中使用了:
// render.vue <script lang="jsx"> import { ref } from "vue"; export default {setup() {const count = ref(100);return () => <div>count is: {count.value}</div>;}, }; </script>注意:script中lang要改成jsx。
或者是一个jsx文件:
// render.jsx import { defineComponent } from vue export default defineComponent({setup() {return () => <div>jsx文件</div>} })Template vs JSX
我们该怎么选择 JSX 和 template 呢?
template优势:template 的语法是固定的 ,只有 v-if 、v-for 等等语法 。我们按照这种固定格式的语法书写 ,这样 Vue3 在编译层面就可以很方便地去做静态标记的优化 ,减少Diff过程 。比如静态提升 ,类型标记,树结构打平等来提高虚拟 DOM 运行时性能 。这也是 Vue 3 的虚拟 DOM 能够比 Vue 2 快的一个重要原因 。
JSX优势:template 则因为语法限制原因 ,不能够像 JSX 那样可以支持更动态的需求 。这也是 JSX 相比于 template 的一个优势 。
JSX 相比于 template 还有一个优势 ,是可以在一个文件内返回多个组件 。
那如何选择呢?
在实现业务需求的时候,优先使用 template ,尽可能地利用 Vue 本身的性能优化 。而对于动态性要求较高的组件可以使用 JSX 来实现 。(比如后面 ,我会用JSX来实现动态表单生成器)
总结
首先 ,我们在项目中通常使用template模板来创建应用 ,template模板会在构建阶段被编译成render渲染函数 。渲染函数就是用来返回虚拟DOM的函数 。
那么我们其实可以跳过这个步骤 ,直接使用h函数来生成虚拟DOM 。
h函数的内部执行的其实是createVNode函数来生成虚拟DOM的 ,但是由于h函数比较难写 ,所以我们使用JSX来更加方便快捷的书写。JSX的内部其实也是使用的createVNode函数 。
JSX在JavaScript中是不能直接执行的 ,在vite项目中 ,我们需要安装插件@vitejs/plugin-vue-jsx
,并进行相应配置才可以 。
最后对比了template和JSX的优劣势。template的优势在于语法固定 ,容易书写 ,并且在编译层面Vue3对template的编译做了很多优化 。而JSX胜在灵活性,在某些动态性要求较高的情况下 ,JSX成了标配 。
所谓 ,术业有专攻,template和JSX没有谁比谁更厉害的存在 ,在不同场景下各有优劣 ,用好了都是编程利器 。
最后
最近找到一个VUE的文档 ,它将VUE的各个知识点进行了总结 ,整理成了《Vue 开发必须知道的36个技巧》 。内容比较详实 ,对各个知识点的讲解也十分到位 。
有需要的小伙伴 ,可以点击下方卡片领取 ,无偿分享
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!