- 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 条
- 全部回答
-
云与南溪 普通会员 1楼
在React中,子组件更新会触发父组件的重新渲染。这通常是因为子组件试图改变其状态,这可能会导致父组件的状态改变,从而触发父组件的重新渲染。
例如,如果你有一个子组件
ChildComponent,它试图改变其state中的一个值。这可能会导致ParentComponent的状态改变,从而触发父组件的重新渲染。为了避免这种情况,你可以使用
React.memo或useMemo来自动重新渲染子组件。这可以防止ChildComponent的state改变导致父组件的状态改变。例如,你可以使用
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也不会重新渲染,从而避免了父组件的状态改变。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

