Vue3 JSX 写法笔记
Vue3 是可以用 JSX 语法直接写的, 大体可以从 https://sfc.vuejs.org/ 的示例看到,其中 <div> 会编译为 h('div'), 具体参考 https://vuejs.org/guide/extra... .
完整的组件定义形如:
import { defineComponent, PropType } from 'vue';
import { onMounted, ref, watch } from 'vue';
const App = defineComponent({
name: "App"
props: {
appId: {
type: String as PropType<string>,
default: '',
},
},
emits: [],
setup(props, {emit, expose, slots}) {
return () => (
<div>TODO</div>
);
},
});
export default App;其中
name调试中组件的名字,props需要用这样的写法用 Object 格式传入, 类型部分用PropType<T>做标记,emits可以用字符串格式指定事件, 而emit函数从参数中拿到,slots也是从参数当中拿到,expose也是从参数当中得到的,- 注意最终的 render 函数, 范围与
setup函数有区别, 其中setup函数只会被执行一次, 而render函数可能多次执行. 而需要响应式追踪的逻辑, 需要写在setup函数里边, 否则行为不能达到预期,
有了 JSX, 原有的 v-if 和 v-else 可以和 React 一样直接写了,
<div>
{!!a ? <span>true</span> : null}
</div>v-model 较为特殊, 转换后需要手动绑定 modelValue 的行为:
<A modelValue={a.value} onUpdate:modelValue={(v) => a.value = v} />expose 的用法, 传入一个对象, 参考 https://www.vuemastery.com/bl...
expose({ reset })@click 写法统一变成 on 加上大写首字符,
<div onClick={() => console.log("TODO")} >v-slots 用法比较复杂, 参考 https://github.com/vuejs/babe... :
const A = (props, { slots }) => (
<>
<h1>{ slots.default ? slots.default() : 'foo' }</h1>
<h2>{ slots.bar?.() }</h2>
</>
);有个 slot/template 写法比较绕, 定制插槽的写法:
<NSelect>
<template #optionEmptyRender>
<div>Demo</div>
</template>
</NSelect>写成:
<NSelect
v-slots={{
optionEmptyRender: () => {
return (
<div>Demo</div>
);
},
}}
/>TODO
转载自:https://segmentfault.com/a/1190000043153659