如何在Vue项目中使用JSX?
SegmentFault
共 16719字,需浏览 34分钟
· 2021-09-19
作者:ManStruggling
来源:SegmentFault 思否社区
什么是 JSX?
JSX是一种JavaScript和XML的结合,即JavaScript + XML = JSX,JSX源于Facebook,可以在JavaScript里写XML,因为这个特性,所以具备了JavaScript的灵活性,同时又兼具html的语义化和直观性
为什么使用 JSX?
jsx对比createElement函数可读性更强;<div></div> VS this.$createElement('div', {...}, [...])
vue-cli3.0及以上默认支持jsx语法
jsx可以使vue组件更容易导入和管理
栗子一
template模板语法
使用最多,不做解释
<div id="vnode">
一些文本
<p class="bar" style="color: red; font-weight: bold;">Only you can stop forest fires</p>
<span>span text</span>
<b>b tag</b>
</div>
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 (
<div id="vnode">
一些文本
<p class="bar" style="color: red; font-weight: bold;">
Only you can stop forest fires
</p>
<span>span text</span>
<b>b tag</b>
</div>
);
}
栗子二
template
<div>
<!-- 模块A -->
<div class="module-a" v-if="type === 0">
<div>
...模块A的代码
</div>
<div>
...公共代码
</div>
</div>
<!-- 模块B -->
<div class="module-b" v-else-if="type === 1">
<div>
...模块B的代码
</div>
<div>
...公共代码
</div>
</div>
<!-- 模块C -->
<div class="module-c" v-else>
<div>
...模块C的代码
</div>
<div>
...公共代码
</div>
</div>
</div>
JSX
render() {
// 提取公共模块代码
const renderCommon = () => <div>...公共代码</div>;
const renderA = () => (
<div class="module-a">
<div>...模块A的代码</div>
{renderCommon()}
</div>
);
const renderB = () => (
<div class="module-b">
<div>...模块B的代码</div>
{renderCommon()}
</div>
);
const renderC = () => (
<div class="module-c">
<div>...模块C的代码</div>
{renderCommon()}
</div>
);
return (
<div>
{this.type === 0 ? renderA() : this.type === 1 ? renderB() : renderC()}
</div>
);
}
Usage
<script>
export default {
render() {
// 条件渲染
const vIfRender = () => {
let show = false;
return (
<div
id={"test"}
class={{ "test-wrapper": true }}
style={{ fontWeight: "bold" }}
>
{show ? <div>display</div> : "hidden"}
</div>
);
};
// v-html渲染
const vHtmlRender = () => <div domPropsInnerHTML={`<i>i text</i>`}></div>;
const listRencer = () => (
<ol>
{[1, 2, 3, 4, 5].map((item) => (
<li>{item}</li>
))}
</ol>
);
// 事件绑定
const handleParentClick = () => {
console.log("trigger parent click");
};
const handleClick = (e) => {
e.stopPropagation();
console.log("trigger click");
};
const eventBindingRender = () => (
<div onClick={handleParentClick}>
parent text
<button domPropsInnerHTML={"点一下试试"} onClick={handleClick}></button>
</div>
);
// 属性绑定
const inputAttrs = {
type: "number",
placeholder: "请输入数字",
};
const attrBindingRender = () => <input {...{ attrs: inputAttrs }} />;
// 指令
const directiveBindingRender = () => (
<button
{...{
directives: [
{
name: "permission",
value: 666,
modifiers: { foo: true },
},
],
}}
>
权限管理
</button>
);
return (
<div>
{
// v-if 三目运算符
vIfRender()
}
{
// v-html
vHtmlRender()
}
{
// 列表渲染
listRencer()
}
{
// 事件绑定
eventBindingRender()
}
{
// 属性绑定
attrBindingRender()
}
{
// 指令
directiveBindingRender()
}
</div>
);
},
};
</script>
插槽和作用域插槽
// child.vue
<script>
export default {
props: {
config: {
type: Object,
required: true
}
},
render() {
return (
<div>
<h3>{this.config.text}</h3>
{this.$scopedSlots.content({
data: this.config.childConfig
})}
</div>
)
}
}
</script>
<script>
import Child from "./child";
export default {
render() {
const config = {
text: "parent text jsx",
childConfig: {
test: "children text jsx",
},
};
return (
<div>
<Child
config={config}
{...{
scopedSlots: {
content: ({data}) => {
return <div>{data.test}</div>;
},
},
}}
></Child>
</div>
);
},
};
</script>
评论
金融研究 | 使用Python测量关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
金融研究(更新) | 使用Python构建关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
词向量(更新) | 使用MD&A2001-2022语料训练Word2Vec模型
buTips: 公众号推送后内容只能更改一次,且只能改20字符。 如果内容出问题,或者想更新内容, 只能重复推送。 为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-03-24-load-w2v-and-expand-your-concpe
大邓和他的Python
0
管理世界2024 | 使用管理层讨论与分析测量「企业人工智能指标」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址 https://textdata.cn/blog/2024-04-19-ai-improve-firm-productivity/
大邓和他的Python
0
五一抢票难,Github上这几个Python项目,你可以试试
又到五一长假啦(虽然其实就放了1天),大家是打算家里蹲or出去玩,又或者是在公司加班呢...今天给大家介绍三个和12306相关的项目,看看你是否用得上。/01/ py12306py12306购票助手,顾名思义,12306买票的~需要在python 3.6以上版本运行程序。1. 安装依赖gi
Crossin的编程教室
0
架构应该如何来理解?
来源:zhuanlan.zhihu.com/p/141027477👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:htt
小哈学Java
0
大量 Java 开源项目停更...
点击关注公众号,Java 干货及时推送↓推荐阅读:投了 100 多份简历后…出品 | OSC开源社区(ID:oschina2013)Sonatype 发布了最新的一份《软件供应链状况》报告,深入探讨了如何在充满选择的世界中定义更好的软件,并探讨人工智能 (AI) 对软件开发的深远
Java技术栈
0
为什么我们公司还在用 Python 开发项目?
作者:哇哒嘻哇https://www.zhihu.com/question/278798145/answer/3416549119最近几年里,经常看到某些曾重度使用 Python 的大公司迁移成其它语言技术栈,但是,那些小公司/小团队的情况如何呢?一直很想了解那些仍在坚持使用 Python,且支撑业
机器学习算法与Python实战
0