一个人追求的目标越高,他的才能就发展得越快,对社会就越有益,我确信这也是一个真理。——玛克西姆·高尔基

首先是官方文档

vue2的:https://cn.vuejs.org/v2/guide/render-function.html#JSX

vue3的:https://v3.cn.vuejs.org/guide/render-function.html#jsx

我们这里以vue2举例:

先使用render函数写一个最简单的jsx组件

1
2
3
4
5
6
7
8
9
10
<script>
export default {
render() {
return <div>Hello World</div>
}
}
</script>

<style>
</style>

注意此处不能有template标签,其他的该咋用就咋用

还有的区别在这个链接里:https://github.com/vuejs/jsx#installation

如果有react的基础,上手这个就很容易啦

1
2
3
4
5
6
7
8
9
10
<div id="ul" class="ul">
{Array.from({ length: 20 }, (i, len) => (
<div class="li">
<div class={"mar mar" + len}>
<span class="checkbox"></span>
<input type="checkbox" />
</div>
</div>
))}
</div>

注意要使用v-html时,应更换为

1
<p domPropsInnerHTML={html} />

其他类似的按照链接内容中即可

Babel Preset JSX

Configurable Babel preset to add Vue JSX support. See the configuration options here.

Compatibility

This repo is only compatible with:

Installation

Install the preset with:

1
npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props

Then add the preset to babel.config.js:

1
2
3
module.exports = {
presets: ['@vue/babel-preset-jsx'],
}

Syntax

Content

1
2
3
render() {
return <p>hello</p>
}

with dynamic content:

1
2
3
render() {
return <p>hello { this.message }</p>
}

when self-closing:

1
2
3
render() {
return <input />
}

with a component:

1
2
3
4
5
6
7
import MyComponent from './my-component'

export default {
render() {
return <MyComponent>hello</MyComponent>
},
}

Attributes/Props

1
2
3
render() {
return <input type="email" />
}

with a dynamic binding:

1
2
3
4
5
6
render() {
return <input
type="email"
placeholder={this.placeholderText}
/>
}

with the spread operator (object needs to be compatible with Vue Data Object):

1
2
3
4
5
6
7
8
render() {
const inputAttrs = {
type: 'email',
placeholder: 'Enter your email'
}

return <input {...{ attrs: inputAttrs }} />
}

Slots

named slots:

1
2
3
4
5
6
7
8
render() {
return (
<MyComponent>
<header slot="header">header</header>
<footer slot="footer">footer</footer>
</MyComponent>
)
}

scoped slots:

1
2
3
4
5
6
7
8
render() {
const scopedSlots = {
header: () => <header>header</header>,
footer: () => <footer>footer</footer>
}

return <MyComponent scopedSlots={scopedSlots} />
}

Directives

1
<input vModel={this.newTodoText} />

with a modifier:

1
<input vModel_trim={this.newTodoText} />

with an argument:

1
<input vOn:click={this.newTodoText} />

with an argument and modifiers:

1
<input vOn:click_stop_prevent={this.newTodoText} />

v-html:

1
<p domPropsInnerHTML={html} />

Functional Components

Transpiles arrow functions that return JSX into functional components, when they are either default exports:

1
export default ({ props }) => <p>hello {props.message}</p>

or PascalCase variable declarations:

1
const HelloWorld = ({ props }) => <p>hello {props.message}</p>