vue3 jsx/tsx 语法 使用css样式,循环,事件,插槽
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>
	);
};
更多推荐
 


所有评论(0)