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。

相关推荐
大怪v16 小时前
AI抢饭?前端佬:我要验牌!
前端·人工智能·程序员
新酱爱学习16 小时前
字节外包一年,我的技术成长之路
前端·程序员·年终总结
小兵张健17 小时前
开源 playwright-pool 会话池来了
前端·javascript·github
IT_陈寒19 小时前
Python开发者必知的5大性能陷阱:90%的人都踩过的坑!
前端·人工智能·后端
codingWhat20 小时前
介绍一个手势识别库——AlloyFinger
前端·javascript·vue.js
Lee川20 小时前
深度拆解:基于面向对象思维的“就地编辑”组件全模块解析
javascript·架构
代码老中医20 小时前
2026年CSS彻底疯了:这6个新特性让我删掉了三分之一JS代码
前端
进击的尘埃20 小时前
Web Worker 与 OffscreenCanvas:把主线程从重活里解放出来
javascript
不会敲代码120 小时前
Zustand:轻量级状态管理,从入门到实践
前端·typescript
踩着两条虫20 小时前
VTJ.PRO 双向代码转换原理揭秘
前端·vue.js·人工智能