为啥反应显示组件更新但控制台不更新?

Posted

技术标签:

【中文标题】为啥反应显示组件更新但控制台不更新?【英文标题】:Why react show that components update but console not?为什么反应显示组件更新但控制台不更新? 【发布时间】:2019-07-16 03:46:55 【问题描述】:

我创建了一个简单的 react redux 应用。 在 Google chrome react 开发工具中,我检查了“突出显示更新”。然后单击任何显示所有组件已更新的按钮,但“AddButton”中的控制台消息不显示任何内容。 错误控制台,反应开发工具还是我?

// index.js
import React from "react";
import ReactDOM from "react-dom";

import App from "./App";
import  Provider  from "react-redux";
import  createStore  from "redux";

const reduser = (state = [], action) => 
  switch (action.type) 
    case "ADD_ITEM":
      return [...state,  text: action.text ];
    case "REMOVE_ITEM":
      return state.filter(t => t.text !== action.text);
    default:
      return state;
  
;

const store = createStore(
  reduser,
  window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);

ReactDOM.render(
  <Provider store=store>
    <App />
  </Provider>,
  document.getElementById("root")
);

//App.js

import React,  Component  from "react";
import AddButton from "./comps/AddButton";
import ListContainer from "./comps/ListContainer";

class App extends Component 
  render() 
    return (
      <div className="App">
        <h1>Simple app</h1>
        <AddButton />
        <ListContainer />
      </div>
    );
  


export default App;

//comps/AddButton.js
import React,  Component  from "react";
import  connect  from "react-redux";

const addItem = () => ( type: "ADD_ITEM", text: Date.now() );

class AddButton extends Component 
  componentDidUpdate(prevProps, prevState, snapshot) 
    console.log("Update");
  

  render() 
    return <button onClick=this.props.addItem>add button</button>;
  


export default connect(
  null,
   addItem 
)(AddButton);

//comps/ListContainer.js
import React,  Component  from "react";
import  connect  from "react-redux";
import ListItem from "./ListItem";

class ListContainer extends Component 
  render() 
    return (
      <ul>
        this.props.items.map(t => (
          <ListItem key=t.text text=t.text />
        ))
      </ul>
    );
  


const mapStateToProps = state => 
  return  items: state ;
;

export default connect(mapStateToProps)(ListContainer);

//comps/ListItem.js
import React from "react";
import  connect  from "react-redux";
const removeItem = text => ( type: "REMOVE_ITEM", text );
const ListItem = props => 
  return (
    <li>
      <button onClick=() => props.removeItem(props.text)>props.text</button>
    </li>
  );
;

export default connect(
  null,
   removeItem 
)(ListItem);

Lorem ipsum dolor sit amet,consectetur adipisicing elit。 Asperiores corporis culpa deleniti dolore dolores eaque eligendi eum fugit in, itaque iusto maiores natus nostrum placeat quisquam similique tempore veniam voluptatum。

【问题讨论】:

AddButton 可能永远不会更新,因此永远不会调用 componentDidUpdate。尝试将其移入:ComponentDidMount 或 getDerivedStateFromProps 取决于您的要求。据我所知,它是 ListContainer 组件,应该在按钮单击时更新。 我会尽量理解它是如何工作的,以进一步调试。如果 react highlight 是假的,那意味着需要找到其他东西。 【参考方案1】:

对于 AddButton 组件,mapStateToProps 为空。也没有从父级接收任何道具,当您单击按钮时,它会更新存储中的值,但由于该更新,App 组件不会重新渲染,因为它没有订阅任何状态更新,因此 AddButton因此不会重新渲染。

再次,因为它也没有订阅商店中的任何更新,它也不会因为商店更新而重新渲染。

将重新渲染的组件是 ListContainerListItem,因为 ListContainer 订阅了存储更新,因此它将更新导致其所有子级重新渲染,前提是它们没有实现 shouldComponentUpdate 和扩展 React.PureComponent(matters仅当组件的道具没有改变时)

【讨论】:

我想,但是如果all 突出显示,如何检测哪些组件更新 你是在 react v15 还是 v16 最后反应 v16.8.3 所以这里发生的情况是,当商店更新时,所有容器都会被触发,这可能就是您看到突出显示更新突出显示的原因。但是内部连接确保它仅触发实际订阅更改状态的组件的重新渲染

以上是关于为啥反应显示组件更新但控制台不更新?的主要内容,如果未能解决你的问题,请参考以下文章

测试在 UI 中更新但在控制台中没有更新,为啥?谁能告诉为啥控制台不更新?

反应:组件状态不更新记分员或计数器

反应+还原。 Connect 不更新组件的状态

如何在从firestore数据库获取数据时修复状态更新

当提供者组件父状态发生变化时,为啥不能更新子组件中的值(带有反应上下文)?

Laravel 为啥不使用 vuejs 更新记录