react和vue 基础使用对比

1.实现功能(ts)

0.基础属性使用

1.组件直接的通信

2.useState 动态修改值

3.循环遍历功能

4.实现类型vue 的 watch ,filter,computed 属性功能

5.实现类似vue2的生命周期

5.类型vue v-if功能的实现

2.文件结构图

3.具体代码

interface.ts
复制代码
import "./index.less";
import { message } from "antd";
import { useState, useEffect, useRef } from "react";
import { UserInfo } from "./interface";
import UserAge from "./components/UserAge"

const UseComponent = () => {
	let [user, setUser] = useState<UserInfo>({ name: "张三", age: 5 });
	const [messageApi, contextHolder] = message.useMessage();
	let [show, setShow] = useState<boolean>(false);

	// 循环遍历
	let [userList] = useState<UserInfo[]>([
		{ id: 1, name: "张三", age: 5 },
		{ id: 2, name: "李四", age: 10 },
		{ id: 3, name: "王五", age: 15 }
	]);

	const updateShow = () => {
		setShow(!show)
	}

	const updateAge = (updateAge: number, type: string = "add") => {
		let ageTemp: number = user.age;
		if (type === "add") {
			ageTemp = ageTemp + updateAge;
		} else if (type === "reduce") {
			ageTemp = ageTemp - updateAge;
		}

		if (ageTemp < 0) {
			messageApi.error("年龄不能小于0");
			ageTemp = 0;
		} else if (ageTemp > 100) {
			messageApi.error("年龄不能大于100");
			ageTemp = 100;
		}

		setUser(user => ({
			...user,
			age: ageTemp
		}));
	};

	const updateChild = (age: number) => {
		updateAge(age)
	}

	// 类型vue 的生命周期
	// Vue2 生命周期      | React 实现
	//---------------------------------------
	// beforeCreate     => 无直接等价(可用 useRef 模拟)
	// created          => useEffect 空依赖
	// beforeMount      => useLayoutEffect 空依赖
	// mounted          => useEffect 空依赖
	// beforeUpdate     => useLayoutEffect 无依赖
	// updated          => useEffect 无依赖
	// beforeDestroy    => useEffect 返回清理函数
	// destroyed        => useEffect 返回清理函数

	const UseComponent = () => {
		// beforeCreate 阶段(组件初始化前)
		const initializedRef = useRef<boolean>(false);
		if (!initializedRef.current) {
			console.log("beforeCreate - 类似 Vue 的 beforeCreate");
			initializedRef.current = true;
		}
		// created 阶段(组件初始化)
		useEffect(() => {
			console.log("created - 类似 Vue 的 created");
		}, []);

		// mounted 阶段(DOM 挂载完成)
		useEffect(() => {
			console.log("mounted - 类似 Vue 的 mounted");
		}, []);

		// updated 阶段(数据更新)
		useEffect(() => {
			console.log("updated - 类似 Vue 的 updated");
		});

		// beforeDestroy 阶段(组件卸载前)
		useEffect(() => {
			return () => {
				console.log("beforeDestroy - 类似 Vue 的 beforeDestroy");
			};
		}, []);
	}

	UseComponent()

	return (
		<>
			{contextHolder}
			<div className="card content-box">
				<div>姓名:{user.name}</div>
				<div>年龄:{user.age}</div>
				<div className="flex-btn">
					<button className="add-btn" onClick={() => updateAge(1)}>年龄+1</button>
					<button className="add-btn" onClick={() => updateAge(1, "reduce")}>年龄-1</button>
					<button className="add-btn" onClick={() => updateShow()}>{!show ? "显示" : '隐藏'}</button>
				</div>
				<div className="child">
					<div>我是子组件</div>
					{show && <UserAge user={user} updateChild={updateChild} />}
				</div>
				<div>
					{userList.map((item, index) => {
						return (
							<div key={index}>
								<div>姓名:{item.name}</div>
								<div>年龄:{item.age}</div>
								<div>------------------</div>
							</div>
						)
					})}
				</div>
			</div>
		</>

	);
};

export default UseComponent;
interface.ts
复制代码
// 定义属性 ?代表可填可不填
export interface UserInfo {
  id?: number;
  name: string;
  age: number;
}
UserAge.tsx
复制代码
import React from "react";
import { UserInfo } from "../interface";

interface Props {
  user: UserInfo;
  updateChild: (num: number) => void;
}

const UserAge: React.FC<Props> = (props) => {

  //获取父组件的参数
  // 类似 vue 的 watch 
  React.useEffect(() => {
    console.log("子组件渲染", props.user);
  }, [props.user]);

  // 类似 vue 的 computed
  const ageStatus: string = React.useMemo(() => {
    return props.user.age > 20 ? '中年' : '少年'
  }, [props.user.age]);

  // 类似vue 的 filter  也可以使用自定义hook的方式实现
  const ageFilter = (age: number) => {
    return age + "岁"
  }

  // 向父组件传递参数
  const updateFan = () => {
    props.updateChild(5);
  };

  return (
    <>
      <div>我是子组件的age: {ageFilter(props.user.age)} {ageStatus}</div>
      <button onClick={updateFan}>子组件控制父组件</button>
    </>
  );
}

export default UserAge;
相关推荐
Bs_MoneyMagnet35 分钟前
基于springboot+vue的心理咨询预约与随访平台的设计与实现 源码+文档
vue.js·spring boot·后端·spring·毕业设计·旅游·计算机毕业设计
李明卫杭州2 小时前
React 复合事件系统对比解析
前端·javascript·react.js
行者全栈架构师3 小时前
Spring Boot 接入 MaxKey 单点登录:6 个内部系统,一次登录全通行
java·vue.js·后端
万敏3 小时前
Vue3 全栈实战第九周:Node.js + Express 后端从零搭建实战记录
vue.js·node.js·全栈
LEE3 小时前
前端转型全栈 01:数据建模,前端最大的盲区
前端·javascript·后端
雪芽蓝域zzs4 小时前
第四十七节:驾驶舱大屏 ECharts 图表集成
前端·javascript·vue.js
梦醒沉醉5 小时前
7、表达日期和时间(前朝遗老Date)
javascript
白雾茫茫丶5 小时前
Vibecoding 一个主题切换动画库:13 种揭幕方式
前端·vue.js·react.js
雪芽蓝域zzs5 小时前
第四十九节:TagsView 右键菜单(带三角箭头)给每个 tag 增加**鼠标右键菜单**(右键标签弹出:关闭、关闭其他、关闭全部)
前端·javascript·vue.js
এ慕ོ冬℘゜5 小时前
从零开发移动端医院挂号页面:适配、交互与前端实现详解
前端·javascript