vue3 jsx/tsx 语法 使用css样式,循环,事件,插槽

下载 @vitejs/plugin-vue-jsx

pnpm add @vitejs/plugin-vue-jsx

配置

vite.config.ts

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import vueJsx from "@vitejs/plugin-vue-jsx";

export default defineConfig({
	plugins: [vue(), vueJsx()],
});

tsconfig.json
当使用 TSX 语法时,确保在 tsconfig.json 中配置了 “jsx”: “preserve”,这样的 TypeScript 就能保证 Vue JSX 语法转换过程中的完整性。

从 Vue 3.4 开始,Vue 不再隐式注册全局 JSX 命名空间。要指示 TypeScript 使用 Vue 的 JSX 类型定义,请确保在你的 tsconfig.json 中包含以下内容:

{
	"compilerOptions": {
		"jsxImportSource": "vue",
		"jsx": "preserve",
	}
}

使用

  • 函数式组件使用

.tsx 文件

export default () => {
	return (
		<>
			<div>test</div>
		</>
	);
};
  • defineComponent + setup 使用
import { defineComponent } from "vue";

export default defineComponent({
	setup(props, { slots, emit }) {
		return () => {
			return <div>demo</div>;
		};
	},
});

使用样式

  • 行内样式不变
export default () => {
	return (
		<>
			<div style="font-size: 30px;">num 值:{num.value}</div>
		</>
	);
};
  • 引入外部 css 文件
import "./base.css";

export default () => {
	return (
		<div>
			<div class="blue">blue</div>
		</div>
	);
};
  • css module
import styles from "./children.module.css";

export default () => {
	return (
		<div>
			<div class={styles.red}>red</div>
		</div>
	);
};

在这里插入图片描述

使用 ref 等变量

在 JSX 表达式中,使用大括号来嵌入动态值
在 JSX 表达式中,ref 不能自动解包 需要 .value

import { ref } from "vue";

const num = ref(1);

export default () => {
	return (
		<>
			<div>num 值:{num.value}</div>
		</>
	);
};

v-on 事件绑定写法

以 on 开头,并跟着大写字母的 props 会被当作事件监听器。比如,onClick 与模板中的 @click 等价。

import { ref } from "vue";

const num = ref(1);
// 2 直接写事件名 handleAdd
// function handleAdd() {
// 	num.value += 1;
// }

// 3 传递参数
function handleAdd(n: number, e: MouseEvent) {
	console.log("11", n, e.x);
	num.value += n;
}
export default () => {
	return (
		<>
			<div>num 值:{num.value}</div>
			{/* 1 内联写法 */}
			{/* <button
				onClick={() => {
					num.value += 1;
				}}
			>
				修改 num + 1
			</button> */}
			{/* 2 直接写事件名 handleAdd  */}
			{/* <button onClick={handleAdd}>修改 num + 1</button> */}

			{/* 3 传递参数 */}
			<button onClick={(e) => handleAdd(2, e)}>修改 num + 2</button>
		</>
	);
};

事件修饰符

对于 .passive、.capture 和 .once 事件修饰符,可以使用驼峰写法将他们拼接在事件名后面:

<button onClickOnce={handleAdd}>修改 num + 1</button>

v-if

import { ref } from "vue";

const flag = ref(true);

export default () => {
	return <>{flag.value ? <div>真</div> : <p>假</p>}</>;
};

v-for

const data = [
	{
		name: "张三",
	},
	{
		name: "李四",
	},
];

export default () => {
	return (
		<ul>
			{data.map((item) => {
				return <li>{item.name}</li>;
			})}
		</ul>
	);
};

组件

src/components/tsx-children.tsx

export default () => {
	return <div>tsx-children</div>;
};

使用
src/components/tsx-father.tsx

import TsxChildren from "./tsx-children";

export default () => {
	return (
		<div>
			<TsxChildren />
		</div>
	);
};

在 setup 中使用

import TsxChildren from "./tsx-children";

export default {
	setup() {
		return () => {
			return (
				<>
					<TsxChildren />
				</>
			);
		};
	},
};

插槽 slot

  • 定义默认插槽

src/components/tsx-children.tsx

export default (props, { slots }) => {
	return (
		<>
			<div class="default">{slots.default?.()}</div>
		</>
	);
};

使用
src/components/tsx-father.tsx

import TsxChildren from "./tsx-children";

export default () => {
	return (
		<div>
			<TsxChildren>
				{{
					default: () => <p>我是默认插槽的内容</p>,
				}}
			</TsxChildren>
		</div>
	);
};
  • 定义具名插槽,传递值

src/components/tsx-children.tsx

export default (props, { slots }) => {
	return (
		<>
			<div class="default">{slots.default?.()}</div>
			{/* 传递 msg  */}
			<div class="footer">{slots.footer?.({ msg: "footer 插槽" })}</div>
		</>
	);
};

使用
src/components/tsx-father.tsx

import TsxChildren from "./tsx-children";

export default () => {
	return (
		<div>
			<TsxChildren>
				{{
					default: () => <p>我是默认插槽的内容</p>,
					// 解构 msg 值,使用
					footer: ({ msg }) => <p>我是-{msg}-的内容</p>,
				}}
			</TsxChildren>
		</div>
	);
};
  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中使用TypeScript和JSX语法编写Ant Design的Table组件可以按照以下步骤进行: 1. 首先,确保你已经安装了Ant Design Vue和TypeScript依赖: ```bash npm install ant-design-vue npm install --save-dev @types/ant-design-vue ``` 2. 在你的Vue组件中引入Table组件和相关的类型定义: ```tsx import { defineComponent } from 'vue'; import { Table } from 'ant-design-vue'; export default defineComponent({ components: { Table }, // ... }); ``` 3. 在Vue组件的template中使用Table组件,并使用JSX语法编写插槽内容: ```tsx <template> <Table :columns="columns" :dataSource="data"> <template #name="{ text }"> <strong>{{ text }}</strong> </template> </Table> </template> ``` 在上述示例中,我们使用了`#name`插槽,它会渲染表格中`name`列的内容。通过`{ text }`参数,我们可以获取到每一行的数据,并在插槽使用。 4. 在Vue组件的`data`选项中定义表格的列和数据源: ```tsx export default defineComponent({ // ... data() { return { columns: [ { title: 'Name', dataIndex: 'name', key: 'name', }, // ... ], data: [ { key: '1', name: 'John Doe', }, // ... ], }; }, }); ``` 在上述示例中,我们定义了一个`columns`数组来描述表格的列,每个列都有`title`、`dataIndex`和`key`属性。我们也定义了一个`data`数组,来表示表格的数据源。 这样,你就可以在Vue 3的TSX语法使用Ant Design的Table组件,并使用插槽来自定义表格的内容了。记得在组件中引入样式文件,以正确渲染Ant Design的样式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值