
直接将文件后缀名从vue改成tsx或者jsx。
在vue3中,可以直接使用render选项编写。
import { defineComponent } from "vue";
export default defineComponent({
name: "Jsx",
render() {
return <div>我是一个div</div>;
},
});也可以在setup中返回。
import { defineComponent } from "vue";
export default defineComponent({
name: "Jsx",
setup() {
return () => <div>我是div</div>;
},
});两种方式都可以,具体看个人习惯,setup中访问不到this,但是render中可以通过this访问当前vue实例
用法
class绑定,和react的jsx绑定的有区别,react中使用className,vue中使用class
setup() {
return () => <div class="test">我是div</div>;
},style绑定
setup() {
return () => <div style={{ color: "red" }}>我是div</div>;
},props绑定
// 父组件
setup() {
return () => (
<div style={{ color: "red" }}>
<span>我是父组件</span>
<Mycom msg={"我是父组件传的值"} />
</div>
);// 子组件,setup的第一个参数,可以获取props里的值
setup(props) {
return () => <div>我是子组件{props.msg}</div>;
},事件绑定
setup() {
function eventClick() {
console.log("点击");
}
return () => <button onClick={eventClick}>按钮</button>;
},组件自定义事件
// 子组件
import { defineComponent } from "vue";
export default defineComponent({
name: "Mycom",
emits: ["event"],
setup(props, { emit }) {
function sendData() {
emit("event", "子组件传递的数据");
}
return () => (
<div>
<span>自定义事件</span>
<button onClick={sendData}>传递数据</button>
</div>
);
},
});// 父组件
// @ts-nocheck
// 这样写在jsx中没问题,但是在tsx中会报ts类型错误,所以我在上面忽略了当前文件ts监测@ts-nocheck
import { defineComponent } from "vue";
import Mycom from "./mycom";
export default defineComponent({
name: "Jsx",
setup() {
function getSon(msg: string) {
console.log(msg);
}
return () => (
<div>
<Mycom onEvent={getSon} />
</div>
);
},
});也可以这样解决ts类型报错
setup() {
function getSon(msg: string) {
console.log(msg);
}
return () => (
<div>
<Mycom {...{ onEvent: getSon }} />
</div>
);
},插槽
// 父组件
setup() {
const slots = {
test: () => <div>具名插槽</div>,
default: () => <div>默认插槽</div>,
};
return () => (
<div>
<Mycom v-slots={slots}></Mycom>
</div>
);
},setup(props, { slots }) {
// 子组件
return () => (
<div>
<span>插槽</span>
{slots.default?.()}
{slots.test?.()}
</div>
);
},指令,v-if,v-for等指令在jsx中无法使用,jsx只支持v-model和v-show指令。
setup() {
const inputData = ref("");
return () => (
<div>
<span v-show={true}>显示</span>
<span v-show={false}>隐藏</span>
<input type="text" v-model={inputData.value} />
<span>{inputData.value}</span>
</div>
);
}, 


网友评论文明上网理性发言 已有0人参与
发表评论: