Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 已记忆的组件将重新渲染其子组件_Javascript_Reactjs_Material Ui - Fatal编程技术网

Javascript 已记忆的组件将重新渲染其子组件

Javascript 已记忆的组件将重新渲染其子组件,javascript,reactjs,material-ui,Javascript,Reactjs,Material Ui,我正在使用react 16.6和材质UI,我在尝试避免不必要的重新渲染时遇到了麻烦。我尝试了几乎所有我能想到的东西,材质ui的子组件在每次用户交互时都会重新呈现。属性是否完全相同并不重要,它们会被重新渲染 我尝试使用memo-froom-react,根组件得到了记忆,避免了不必要的重新渲染,但即使如此,我尝试过的所有react工具(react-dev-tools和为什么更新包)都会检测到子组件被重新渲染 下面是一个简单的片段: import React, { PureComponent, mem

我正在使用react 16.6和材质UI,我在尝试避免不必要的重新渲染时遇到了麻烦。我尝试了几乎所有我能想到的东西,材质ui的子组件在每次用户交互时都会重新呈现。属性是否完全相同并不重要,它们会被重新渲染

我尝试使用memo-froom-react,根组件得到了记忆,避免了不必要的重新渲染,但即使如此,我尝试过的所有react工具(react-dev-tools和为什么更新包)都会检测到子组件被重新渲染

下面是一个简单的片段:

import React, { PureComponent, memo } from 'react';

import ListItem from '@material-ui/core/ListItem';
import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';
import ListItemText from '@material-ui/core/ListItemText';

const rowText = ({ title, artist }) =>
  console.log('Row text render') || (
    <ListItemText primary={title} secondary={artist} />
  );

const RowText = memo(rowText);

const row = ({ selected, song, onSelect, favorite, LikeButton }) =>
  console.log('Row rendered') || (
    <ListItem
      button
      selected={selected === song.title}
      onClick={() => onSelect(song.title)}
    >
      {selected === song.title && <PlayArrowIcon color="primary" />}
      <RowText {...song} />
      <ListItemSecondaryAction>
        <LikeButton liked={favorite} title={song.title} />
      </ListItemSecondaryAction>
    </ListItem>
  );

row.displayName = 'Row';

const Row = memo(row);
即使这样,我也得到了可以避免的消息,即对组件的所有子级进行重新渲染

即使是最简单的组件(只有一个MUI组件)和一个根,在任何情况下都不要对我进行udpate,我也会得到不必要的重新渲染

class RowText extends Component {
  shouldComponentUpdate = (nextProps, nextState) => {
    return false;
  };

  render() {
    const { title, artist } = this.props;
    return <ListItemText primary={title} secondary={artist} />;
  }
}
class行文本扩展组件{
shouldComponentUpdate=(nextProps,nextState)=>{
返回false;
};
render(){
const{title,artist}=this.props;
返回;
}
}
这一定是材质ui上的某种错误

编辑


这种情况只发生在ListItem组件及其子组件上,因此它们上一定存在某种缺陷。我对其他组件尝试了相同的技术,如果不应该,则不会重新渲染子组件。

是否更改传递到列表中的数据
ListItem
被包装在一个更高阶的组件中,以从列表祖先访问上下文,它可能在代码之外得到强制更新。此时,我认为最好包含整个代码。我不会把任何东西传递给列表。这有点奇怪,因为当另一个组件上的微调器运行时,该组件的状态仍在重新渲染,因此材质组件应该在某种程度上是连接的。也许是通过各种方式?你找到解决办法了吗?我遇到了同样的问题,现在有两个不同的MUI组件…我只是停止尝试,对不起。但我认为这与上下文提供者有关,上下文提供者直接进入MUI组件,绕过父级。
class RowText extends Component {
  shouldComponentUpdate = (nextProps, nextState) => {
    return false;
  };

  render() {
    const { title, artist } = this.props;
    return <ListItemText primary={title} secondary={artist} />;
  }
}