Требуется повторно отображать строки таблицы при изменении состояния в редуксе

Я использовал избыточное действие для удаления первых строк таблицы при нажатии Good btn

Редуктор LineMange.js

const LineManage = (state = Initstate, action) => {
  switch (action.type) {
    case 'AddP':
      console.info(state.Products);
      return {};
    case 'RemP':
      state.data.splice(0, 1);
      console.info(state.data);
      return Object.assign({}, state, {
        data: state.data
      });
    default:
      console.info(state.data);
      return state;
  }
};

Панель.jsx

class Pannel extends Component {
  constructor(props) {
    super(props);
    this.state = {
      data: this.props.data,
      Img:
        'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/No_image_3x4.svg/1200px-No_image_3x4.svg.png', // default Value
      Sheet: {
        in_or: 0,
        Hr_plan: 0,
        Inactual: 0,
        NG: 0,
        DIFF: 0,
        T_plan: 0,
        T_Actual: 0,
        T_DIFF: 0,
        OEEE: 0,
        OA: 0,
        NG_T: 0,
        BAL: 0
      } // default value
    };
    const { RemP } = this.props;
    this.RemP = RemP.bind(this);
    this.handleScanner = this.handleScanner.bind(this);
    this.codevalue = '';
  }

  componentDidMount() {
    document.addEventListener('keypress', this.handleScanner);
  }

  shouldComponentUpdate(nextProps) {
    console.warn('update ' + nextProps);
    return true;
  }

  handleScanner(e) {
    if (e.keyCode === 13) {
      alert(this.codevalue);
    } else {
      this.codevalue += e.key;
    }
  }

  render() {
    console.warn('render');
    return (
      <>
        <Container fluid = "true">
          <Row>
            <Col>
              <Psheet />
            </Col>
          </Row>
          <Row style = {{ marginTop: '15px' }}>
            <Col lg = {6} md = {6}>
              <div className = "frame">
                <Container>
                  <h2 className = "Header">Sheet</h2>
                  <div className = "TableControl">
                    <Table striped bordered hover>
                      <thead>
                        <th className = "text-center p-0">Kaban No.</th>
                        <th className = "text-center p-0">Part No.</th>
                        <th className = "text-center p-0">Part Name</th>
                        <th className = "text-center p-0">Qty's per Kaban</th>
                        <th className = "text-center p-0">Status</th>
                      </thead>
                      <tbody>
                        {this.state.data.map((data, index) => {
                          const { Name, Unit, Status } = data.info;
                          return (
                            <tr value = {data.ID}>
                              <td>{index + 1}</td>
                              <td>{data.ID}</td>
                              <td>{Name}</td>
                              <td>{Unit}</td>
                              <td>{Status}</td>
                            </tr>
                          );
                        })}
                      </tbody>
                    </Table>
                  </div>
                  <hr />
                  <Row>
                    <Col>
                      <Button
                        onClick = {this.RemP}
                        style = {{ marginRight: ' 20px' }}
                        variant = "success"
                        size = "lg"
                      >
                        Good
                      </Button>
                    </Col>
                    <Col>
                      <Button
                        style = {{ marginRight: ' 20px' }}
                        variant = "danger"
                        size = "lg"
                      >
                        No Good
                      </Button>
                    </Col>
                  </Row>
                  <hr />
                </Container>
              </div>
            </Col>
            <Col style = {{ marginTop: '20px' }} lg = {6} md = {6}>
              <div className = "frame">
                <Qp imgsr = {this.state.data[0].info.Img_src} />
              </div>
            </Col>
          </Row>
        </Container>
      </>
    );
  }
}

const mapDispatchToProps = dispatch => {
  return {
    RemP: () => dispatch(RemP())
  };
};

const mapStateToProps = function (state) {
  return {
    data: state.LineManage.data
  };
};

const Pan = connect(mapStateToProps, mapDispatchToProps)(Pannel);
export default Pan;

состояние в редуксе изменяется, но компонент не перерисовывается и даже не запускает shouldcomponentupdate(), даже если я пытался передать реквизиты непосредственно в render(), но другая страница, которая подсчитывает длину данных в редюсере работает нормально, поэтому, если я сделал что-то не так, пожалуйста, скажите мне, я действительно новичок в реакции-редукс

Когда вы инициализируете состояние в конструкторе, состояние data заполняется только один раз и не будет заполняться снова при изменении реквизита из Redux. Попробуйте использовать this.props.data вместо this.state.data в вашем JSX. В состоянии он вообще не нужен. Если вам нужно, чтобы data был в состоянии, для обновления состояния можно использовать хук жизненного цикла.

IOOIIIO 26.12.2020 10:12

@IOOIIIO Я пытался вырезать. Я все еще не перерисовываю.

TimNDF 26.12.2020 10:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
2
613
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы назначили this.props.data на state.data на constructor. state.data не изменится при изменении this.props.data.

Таким образом, вы должны использовать данные реквизита непосредственно в render(), чтобы немедленно отразить изменение магазина.

this.props.data.map((data,index) => {
  // ...
})

ОБНОВЛЯТЬ

Попробуйте заменить редуктор на RemP, как показано ниже.

case 'RemP':
  return {
    ...state,
    data: state.data.slice(1, state.data.length)
  }

Это Работа Большое спасибо, но можете ли вы объяснить, почему? потому что я действительно понятия не имею.

TimNDF 26.12.2020 10:50

Когда вы используете Object.assign, вы назначаете как {data: state.data}, что означает просто назначение ссылки на объект массива. Это не будет отражать сторону обзора. Вы должны назначить совершенно новый объект массива. Таким образом, вы также можете изменить свой код на { data: [...state.data] }, и это тоже сработает.

baymax 26.12.2020 11:11

Хорошо, теперь я понял, спасибо @baymax

TimNDF 26.12.2020 11:18
  1. Вы можете использовать this.props.data вместо this.state.data.
    <tbody>
       {this.props.data.map((data,index) => {
         //...
       })}
    </tbody>
  1. Или вы можете использовать статический жизненный цикл реакции getDerivedStateFromProps (реквизит, состояние).
    static getDerivedStateFromProps(props, state) {
      this.state.data = props.data;
    }

Другие вопросы по теме