如何在Vue项目中使用JSX()
Author:ManStruggling什么是 JSX?
JSX是一种JavaScript和XML的结合,即JavaScript + XML = JSX,JSX源于Facebook,可以在JavaScript里写XML,因为这个特性,所以具备了JavaScript的灵活性,同时又兼具html的语义化和直观性
为什么使用 JSX?
- jsx对比createElement函数可读性更强; VS this.$createElement('div', {...}, [...])
- vue-cli3.0及以上默认支持jsx语法
- jsx可以使vue组件更容易导入和管理
栗子一 template模板语法
使用最多,不做解释
一些文本Only you can stop forest fires
span text
b tag
createElement
createElement函数实际上创建的是Virtual Node,创建VNode树,一旦Dom树的结构复杂,dom节点属性太多,势必会造成可读性差的问题。。。
render(h) {
return h(
"div",
{
attrs: {
id: "vnode",
},
},
[
"一些文本",
h(
"p",
{
class: {
bar: true,
},
style: {
color: "red",
fontWeight: "bold",
},
},
"Only you can stop forest fires"
),
h("span", {}, "span text"),
h("b", { domProps: { innerText: "b tag" } }),
]
);
}
JSX
然后jsx就闪亮登场
render() {
return (一些文本【如何在Vue项目中使用JSX()】Only you can stop forest fires
span text
b tag);
}
可能有的同学觉得,就这,跟template没什么区别呀。
这个案例只涉及到html没有涉及javascript,jsx是把javascript和html放在一起来书写的。所以看下个栗子
栗子二
根据type的值进行条件渲染,A、B、C三个模块,每个模块有自己的对应模块的代码,也有一些公共的模块,假设这些代码有很多行,势必会造成阅读性的降低。有人可能觉得如果这样的话,把公共代码抽离出一个单独的组件不就好了,这样使可以解决问题,如果这里的公共代码仅仅只在这一个文件内使用,别的文件不会对这些公共代码做引用呢,要不要考虑抽离公共组件的必要性呢,jsx就可以完美的解决这些问题。template ,在template
...模块A的代码...公共代码...模块B的代码...公共代码...模块C的代码...公共代码
createElement
这里就不做createElement函数的说明了,想必也没有多少人用这个吧。。。。有的话,那你赢了JSX
template模板代码超过三百行,就很难阅读了,会重复在VM、V层切换,所以在复杂的大型项目中建议用jsx来做render,提高代码的可阅读性
render() {
// 提取公共模块代码
const renderCommon = () => ...公共代码;
const renderA = () => (...模块A的代码
{renderCommon()});
const renderB = () => (...模块B的代码
{renderCommon()});
const renderC = () => (...模块C的代码
{renderCommon()});
return ({this.type === 0 ? renderA() : this.type === 1 ? renderB() : renderC()});
}
Usage
插槽和作用域插槽
// child.vue
组件直接引入使用,无需components注册,方便导入和管理
上述总结使用jsx的一些特殊情况,条件渲染、v-html、列表的渲染、事件的绑定、属性绑定、指令的使用、插槽和作用域插槽,聪明的你肯定可以看出来,使用jsx能像vue3的composition API一样把相同的逻辑代码聚合在一起,避免大型项目开发时,页面逻辑复杂导致代码量上升,option API在template和methods之间来回切换的问题。
第一次撰文,如有疑问,欢迎各位大佬斧正,希望大家能够STAR支持一下小编,希望小编的内容对大家有所帮助~
[TOC]
推荐阅读
- 任时光绽放成六月繁花
- 我从来不做坏事
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 樱花雨
- 如何寻找情感问答App的分析切入点
- vue-cli|vue-cli 3.x vue.config.js 配置
- 拍照一年啦,如果你想了解我,那就请先看看这篇文章
- 2020-04-07vue中Axios的封装和API接口的管理
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus使用queryWrapper如何实现复杂查询