这些性能都比较简单些, 通过react hooks和react class都进行了实现
喜爱就点赞呗
react 实现 watch
react hook 实现 watch
function useWatch<T>(deps: T, handler: (next: T, prev: T) => void, immediate = false) { let nextRef = useRef<T>(); const isImmediate = useRef(true); useEffect(() => { if (isImmediate.current) { handler(nextRef.current as T, deps); } else { isImmediate.current = true; } return () => { nextRef.current = deps; }; }, [deps]);}# 应用let [count, setCount] = useState(0);useWatch(count, (next: typeof count, prev: typeof count) => { console.log(next, prev);});
react 类写法 实现 watch
class Watch extends React.Component { state = { count: 0 }; constructor(props: FC) { super(props); } setCount() { this.setState({ count: this.state.count + 1, }); } componentDidUpdate(_prev: any, prevState: typeof this.state) { console.log(prevState.count, this.state.count); } render() { return ( <div> <button onClick={this.setCount.bind(this)}>按钮</button> </div> ); }}
react 实现 插槽(slot)
react hooks版本
function Child({ children }: { children: React.ReactNode }) { return ( <div> child {children} </div> );}export default function Slot() { return ( <div> <Child> <p>2333</p> </Child> </div> );}
react 类写法
class Child extends React.Component { render() { const { children } = this.props; return ( <div> child {children} </div> ); }}class Name extends React.Component { constructor(props: React.FC) { super(props); } render() { return ( <Child> <p>2333</p> </Child> ); }}
react 实现 computed
react hooks版本
通过useMemo模仿即可
export default function Computed() { let [count, setCount] = useState(0); const getCount = useMemo(() => { return count * 2; }, [count]); return ( <div> {getCount} <button onClick={() => { setCount(count + 1); }}>按钮 </button> </div> );}
react 类写法
原理则是每次setState都会触发render, 而后从新获取newCount
class Name extends React.Component { state = { count: 0 }; constructor(props: React.FC) { super(props); } get newCount() { return this.state.count + 1; } render() { return ( <div> <p>{this.newCount}</p> </div> ); }}
react 实现 v-model
react hooks版本
interface formProps { name?: string; age?: string;}export default function Model() { const [form, setForm] = useState<formProps>({}); const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>, key) => { setForm((raw) => ({ ...raw, [key]: e.target.value })); }, []); function onClick() { console.log(form); } return ( <div> <input type="text" value={form.name ?? ""} onChange={(e) => handleChange(e, "name")} /> <input type="text" value={form.age ?? ""} onChange={(e) => handleChange(e, "age")} /> <button onClick={onClick}>按钮</button> </div> );}
react 类写法
interface formProps { name?: string; age?: string;}class Model extends React.Component<unknown, { form: formProps }> { constructor(props: React.FC) { super(props); this.state = { form: {} }; } handleChange(e: React.ChangeEvent<HTMLInputElement>, key: string) { this.setState({ form: { ...this.state.form, [key]: e.target.value }, }); } onClick = () => { console.log(this.state.form); }; render() { const { form } = this.state; return ( <div> <input type="text" value={form.name ?? ""} onChange={(e) => this.handleChange(e, "name")} /> <input type="text" value={form.age ?? ""} onChange={(e) => this.handleChange(e, "age")} /> <button onClick={this.onClick}>按钮</button> </div> ); }}
react 实现 css scoped
css module
# index.module.css.app { color: aqua; flex: 1;}# Css.tsximport Style from "./index.module.css";export default function Css() { return ( <div> <p className={Style.app}>我是一个字段</p> </div> );}
css in js (emotion)
装置
npm i @emotion/styled @emotion/react
应用
/* @jsxImportSource @emotion/react */import styled from "@emotion/styled";import { css } from "@emotion/react";import Style from "./index.module.css";const base = css` color: #ee298c;`;const Container = styled.div` padding: 23px; &:hover { color: ${(props) => props.color}; }`;export default function Css() { return ( <Container color="blue"> <p className={Style.app}>我是一个字段</p> <p css={css` ${base}; background-color: #eee; `} > test </p> <p className="test">23333</p> </Container> );