เหตุใดการตอบสนองจึงแสดงว่าส่วนประกอบอัปเดต แต่คอนโซลไม่อัปเดต

ฉันสร้างแอป react redux แบบง่ายๆ ในเครื่องมือ dev โต้ตอบของ Google chrome ฉันทำเครื่องหมายที่ "การอัปเดตไฮไลต์" จากนั้นคลิกที่ปุ่มใดๆ ซึ่งแสดงว่าส่วนประกอบทั้งหมดอัปเดตแล้ว แต่ข้อความคอนโซลใน "AddButton" ไม่แสดงอะไรเลย ข้อผิดพลาดคอนโซล ตอบสนองเครื่องมือ dev หรือฉัน?

// 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 นั่ง 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.


person Vla Mai    schedule 22.02.2019    source แหล่งที่มา
comment
เป็นไปได้ที่ AddButton จะไม่อัปเดตเลย ดังนั้นไม่เคยมีการเรียก ComponentDidUpdate ลองย้ายเข้าไปที่: ComponentDidMount หรือ getDerivedStateFromProps ขึ้นอยู่กับความต้องการของคุณ จากสิ่งที่ฉันเห็นมันเป็น ListContainer Component ที่ควรอัปเดตเมื่อคลิกปุ่ม   -  person Mobeen    schedule 22.02.2019
comment
ฉันจะพยายามทำความเข้าใจว่ามันทำงานอย่างไรเพื่อแก้ไขจุดบกพร่องเพิ่มเติม หากการตอบสนองไฮไลต์บอกว่าเป็นเท็จ นั่นหมายความว่าจำเป็นต้องหาอย่างอื่น   -  person Vla Mai    schedule 22.02.2019


คำตอบ (1)


สำหรับคอมโพเนนต์ AddButton นั้น mapStateToProps จะเป็นโมฆะ นอกจากนี้ยังไม่ได้รับอุปกรณ์ประกอบฉากใด ๆ จากพาเรนต์และเมื่อคุณคลิกปุ่ม มันจะอัปเดตค่าในร้านค้า แต่เนื่องจากการอัปเดตนั้น ส่วนประกอบของแอปจึงไม่แสดงผลซ้ำเนื่องจากไม่ได้สมัครรับการอัปเดตสถานะใด ๆ ดังนั้น 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