账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    react 子组件更新,其他组件也被更新
    34
    0

    有这样一个组件结构:

    |-- div
    |  |-- Group1
    |  |  |-- Input1
    |  |  |-- Input2
    |  |-- Group2
    |  |  |-- Input3
    |  |  |-- Input4

    我在触发修改 Input1 的时候,会导致 render 所有的组件:

    [Render Group]
    [Render Input] flag: 1
    [Render Input] flag: 2
    [Render Group]
    [Render Input] flag: 3
    [Render Input] flag: 4

    请问如何避免呢,比如我在修改 Input1时候,仅渲染 Input1,其余不重新渲染?


    问题代码如下:

    class App extends Component {
      constructor (props) {
        super(props)
        this.state = {
          val1: '',
          val2: '',
          val3: '',
          val4: ''
        }
      }
    
      handleInput (flag, val) {
        const key = 'val' + flag
        this.setState({ [key]: val })
      }
    
      render () {
        return (
          <div className="App">
            <Group name="Group1">
              <Input flag="1" onChange={v => this.handleInput.call(this, 1, v)}/>
              <Input flag="2" onChange={v => this.handleInput.call(this, 2, v)}/>
            </Group>
            <Group name="Group2">
              <Input flag="3" onChange={v => this.handleInput.call(this, 3, v)}/>
              <Input flag="4" onChange={v => this.handleInput.call(this, 4, v)}/>
            </Group>
          </div>
        )
      }
    }
    class Group extends Component {
      render () {
        console.log('[Render Group]')
        const children = this.props.children
        return (
          <div>
            <h1>{this.props.name}</h1>
            {
              React.Children.map(children, child => child)
            }
          </div>
        )
      }
    }
    class Input extends Component {
      constructor (props) {
        super(props)
        this.state = {
          value: ''
        }
      }
    
      handleChange (e) {
        const cb = this.props.onChange
        const value = e.target.value
        this.setState({ value })
        cb && cb(value)
      }
    
      render () {
        console.log('[Render Input] flag:', this.props.flag)
        return (
          <div>
            <input value={this.state.value} onChange={e => this.handleChange.call(this, e)}/>
          </div>
        )
      }
    }
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 云与南溪 普通会员 1楼

      在React中,子组件更新会触发父组件的重新渲染。这通常是因为子组件试图改变其状态,这可能会导致父组件的状态改变,从而触发父组件的重新渲染。

      例如,如果你有一个子组件ChildComponent,它试图改变其state中的一个值。这可能会导致ParentComponent的状态改变,从而触发父组件的重新渲染。

      为了避免这种情况,你可以使用React.memouseMemo来自动重新渲染子组件。这可以防止ChildComponentstate改变导致父组件的状态改变。

      例如,你可以使用React.memo来防止子组件的state改变导致父组件的状态改变:

      ```jsx import React, { memo } from 'react';

      const MemoizedComponent = memo((state = {}) => { // 子组件的代码 });

      export default MemoizedComponent; ```

      然后,你可以在ParentComponent中使用useMemo

      ```jsx import React from 'react'; import MemoizedComponent from './MemoizedComponent';

      const ParentComponent = () => { // 使用 memo 包装子组件 const childComponent = useMemo(() => { // 子组件的代码 }, []);

      // 父组件的代码 };

      export default ParentComponent; ```

      这样,即使子组件的state改变,ChildComponent也不会重新渲染,从而避免了父组件的状态改变。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部