React常见知识点

1. setCount(10)与setCount(preCount => preCount + 10) 的区别:

js 复制代码
import React, { useState } from 'react';
export default function CounterHook() {
    const [count, setCount] = useState(() => 10);
    console.log('CounterHook渲染');
    function handleBtnClick() {
        // 下面这种只会加10
        setCount(count + 10);
        setCount(count + 10);
        setCount(count + 10);
        setCount(count + 10);

        // 下面这种会加到40
        // setCount((prevCount) => prevCount + 10);
        // setCount((prevCount) => prevCount + 10);
        // setCount((prevCount) => prevCount + 10);
        // setCount((prevCount) => prevCount + 10);
    }
    return (
        <div>
            <h2>当前计数: {count}</h2>
            <button onClick={handleBtnClick}>+10</button>
        </div>
    );
}

2. 如何在父组件中引用子组件的某个元素? forwardRef

js 复制代码
// 父组件
import React, { useEffect, useRef } from 'react';
import Product from './product';
export default function App(props) {
    const liRef = useRef();
    useEffect(() => {
        console.log('ref', liRef.current)
    })
    return (
        <>
            <Product ref={liRef} />
        </>
    );
}
js 复制代码
// 子组件 - 函数组件
import React from 'react';
import { forwardRef } from 'react';
export default forwardRef((props, ref) => {
    const getProdInfo = function (e) {
        console.log(e.target.innerText);
    };
    return (
        <ul onClick={getProdInfo}>
            <li ref={ref}>商品1</li>
            <li>商品2</li>
        </ul>
    );
});
js 复制代码
// 子组件 - class组件
import React, { forwardRef } from 'react';
class Product extends React.Component {
    constructor(props) {
        super(props);
    }
    getProdInfo = function (e) {
        console.log(e.target.innerText);
    };
    render() {
        console.log(1, this.props)
        return (
            <ul onClick={this.getProdInfo}>
                <li ref={this.props.innerRef}>商品1</li>
                <li>商品2</li>
            </ul>
        );
    }
}
export default forwardRef((props, ref) => <Product innerRef={ref} {...props} />);

联想:
ref的作用

  1. 通过ref操作dom,分为 1.作用在DOM节点上;2作用在组件上(此时为组件的实例);
  2. 用ref引用一个值;参考官网useRef

3. useImperativeHandle

向父组件暴露一个自定义的 ref 句柄。

默认情况下,组件不会将它们的 DOM 节点暴露给父组件。举例来说,如果你想要 MyInput 的父组件 能访问到 <input> DOM 节点,你必须选择使用 forwardRef

js 复制代码
import { forwardRef } from 'react';

const MyInput = forwardRef(function MyInput(props, ref) {
  return <input {...props} ref={ref} />;
});

在上方的代码中,MyInput 的 ref 会接收到 DOM 节点。然而,你可以选择暴露一个自定义的值。为了修改被暴露的句柄,在你的顶层组件调用 useImperativeHandle。

相关推荐
eason_fan10 小时前
从一则内存快照看iframe泄漏:活跃与Detached状态的回收差异
前端·性能优化
狗头大军之江苏分军10 小时前
年底科技大考:2025 中国前端工程师的 AI 辅助工具实战盘点
java·前端·后端
编程修仙11 小时前
第三篇 Vue路由
前端·javascript·vue.js
比老马还六11 小时前
Bipes项目二次开发/硬件编程-设备连接(七)
前端·javascript
掘金一周11 小时前
前端一行代码生成数千页PDF,dompdf.js新增分页功能| 掘金一周 12.25
前端·javascript·后端
张就是我10659212 小时前
漏洞复现指南:利用 phpinfo() 绕过 HttpOnly Cookie 保护
前端
Kagol12 小时前
🎉TinyVue v3.27.0 正式发布:增加 Space 新组件,ColorPicker 组件支持线性渐变
前端·vue.js·typescript
潍坊老登12 小时前
大前端框架汇总/产品交互参考UE
前端
方安乐12 小时前
获取URL参数如何避免XSS攻击
前端·xss
十二AI编程12 小时前
MiniMax M2.1 实测,多语言编程能力表现出色!
前端