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。

相关推荐
吃饺子不吃馅8 小时前
Canvas实现协同电影选座
前端·架构·canvas
前端慢慢其修远8 小时前
fabric.js 中originX originY center设置问题
前端·fabric
im_AMBER8 小时前
React 04
前端·react.js·前端框架·1024程序员节
fhsWar9 小时前
Vue3 props: `required: true` 与 vant 的`makeRequiredProp`
前端·javascript·vue.js
泷羽Sec-静安10 小时前
Less-1 GET-Error based-Single quotes-String GET-基于错误-单引号-字符串
前端·css·网络·sql·安全·web安全·less
小时前端10 小时前
虚拟DOM已死?90%内存节省的Vapor模式正在颠覆前端
前端·html
Keepreal49610 小时前
Web Components简介及如何使用
前端·javascript·html
进击的野人10 小时前
JavaScript变量声明的前世今生:从var到let/const的演进
javascript
jump68010 小时前
TS中 unknown 和 any 的区别
前端
无羡仙10 小时前
AI终于‘看见’网页了!Stagewise让UI修改从‘盲调’变‘指哪打哪
前端