×

在vue3中编写jsx的两种方式

作者:Terry2021.07.15来源:Web前端之家浏览:25951评论:0
关键词:vuejs

直接将文件后缀名从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>
    );
},

您的支持是我们创作的动力!
温馨提示:本文作者系Terry ,经Web前端之家编辑修改或补充,转载请注明出处和本文链接:
https://jiangweishan.com/article/vuejs20210715a3.html

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

发表评论: