2022-06-17
一个人追求的目标越高,他的才能就发展得越快,对社会就越有益,我确信这也是一个真理。——玛克西姆·高尔基
首先是官方文档
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 | <script> |
注意此处不能有template
标签,其他的该咋用就咋用
还有的区别在这个链接里:https://github.com/vuejs/jsx#installation
如果有react
的基础,上手这个就很容易啦
1 | <div id="ul" class="ul"> |
注意要使用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:
- Babel 7+. For Babel 6 support, use vuejs/babel-plugin-transform-vue-jsx
- Vue 2+. JSX is not supported for older versions. For Vue 3 support, there is an experimental plugin available as @ant-design-vue/babel-plugin-jsx.
Installation
Install the preset with:
1 npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-propsThen 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>