Зачем реагировать, показывая, что компоненты обновляются, а консоль нет?

Я создаю простое приложение React redux. В инструментах разработчика Google Chrome React я проверяю «Выделить обновления». А затем нажмите любую кнопку, это показывает, что все компоненты обновлены, но сообщение консоли в «AddButton» ничего не показывает. Ошибки консоли, React Dev Tool или меня?

// 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, conctetur adipisicing elit. Asperiores corporis culpa deleniti dolore dolores eaque eligendi eum fugit in, itaque iusto maiores natus nostrum placeat quisquam similique tempore veniam voluptatum.


person Vla Mai    schedule 22.02.2019    source источник
comment
Возможно, что AddButton никогда не обновляется и, следовательно, componentDidUpdate никогда не вызывается. Попробуйте переместить его: ComponentDidMount или getDerivedStateFromProps в зависимости от ваших требований. Из того, что я вижу, это компонент ListContainer, который должен обновляться при нажатии кнопки.   -  person Mobeen    schedule 22.02.2019
comment
Попробую разобраться, как это все работает, для дальнейшей отладки. Если подсветка реакции показывает ложь, это означает, что нужно найти что-то еще.   -  person Vla Mai    schedule 22.02.2019


Ответы (1)


Для компонента AddButton mapStateToProps имеет значение NULL. Кроме того, он не получает никаких реквизитов от родителя, и когда вы нажимаете кнопку, он обновляет значение в магазине, но из-за этого обновления компонент приложения не выполняет повторную визуализацию, потому что он не подписывается на какое-либо обновление состояния, и поэтому AddButton не будет повторно отрисовываться из-за этого.

Опять же, поскольку он также не подписывается ни на одно обновление в магазине, он не будет повторно отображаться из-за обновления магазина.

Компоненты, которые будут повторно отображать, - это ListContainer и ListItem, поскольку ListContainer подписывается на обновления хранилища и, следовательно, он будет обновлять, вызывая повторную визуализацию всех его дочерних элементов, при условии, что они не реализуют shouldComponentUpdate и расширяют React.PureComponent (имеет значение только тогда, когда свойства компонента не меняются)

person Shubham Khatri    schedule 22.02.2019
comment
Как я думаю, но как определить, какие компоненты обновляются, если они все выделяются - person Vla Mai; 22.02.2019
comment
Вы на React v15 или v16 - person Shubham Khatri; 22.02.2019
comment
последняя реакция v16.8.3 - person Vla Mai; 22.02.2019
comment
Итак, что здесь происходит, так это то, что при обновлении магазина запускаются все контейнеры, и, вероятно, поэтому вы видите выделение обновлений. Однако внутреннее подключение гарантирует, что он запускает повторную визуализацию только для компонентов, которые фактически подписываются на измененное состояние. - person Shubham Khatri; 22.02.2019