组件未在 setState React 上重新渲染

Posted

技术标签:

【中文标题】组件未在 setState React 上重新渲染【英文标题】:Component not re rendering on setState React 【发布时间】:2019-08-10 15:06:48 【问题描述】:

当我设置状态时,我的组件没有重新渲染。我试图在父组件和子组件上设置状态,但它仍然不起作用。我也试过 this.forceUpdate().. 不工作..

这是我的父组件:

import React,  Component  from "react";
import Header from "./Header";
import Note from "./Note";

class Notes extends Component 
  constructor() 
    super();
    this.state = 
      notes: [],
      reRender: false
    ;
  

  getUserId = () => 
    var str = window.location.pathname;
    var words = str.split("/");
    return words[2];
  ;

  handler = () => 
    this.setState(
      reRender: true
    );
  ;

  componentDidMount() 
    fetch(`http://localhost:4000/notes?sls_id=$this.getUserId()`)
      .then(res => res.json())
      .then(res => 
        this.setState(
          notes: res.data
        );
      );
  

  render() 
    const  notes  = this.state;
    return (
      <div>
        <Header />
        <ul style= marginTop: "10px", marginBottom: "10px" >
          Object.keys(notes).map(key => (
            <Note
              key=key
              index=key
              details=notes[key]
              action=this.handler
            />
          ))
        </ul>
      </div>
    );
  


export default Notes;

这是我的子组件:

import React,  Component  from "react";
import  Card, ListGroup, Button  from "react-bootstrap";

class Note extends Component 
  deleteNote = _ => 
    const prp = this.props.details;
    fetch(`http://localhost:4000/notes/delete?note_id=$prp.note_id`).catch(
      err => console.error(err)
    );
  ;

  render() 
    const prp = this.props.details;

    return (
      <Card style= margin: "15px" >
        <Card.Header>
          <div className="customerName">prp.title</div>
        </Card.Header>
        <Card.Body>
          <blockquote className="blockquote mb-0">
            <p>prp.body</p>
            <footer className="blockquote-footer">
              <cite title="Source Title">
                posted on prp.date.substring(0, prp.date.length - 14)
              </cite>
            </footer>
          </blockquote>
          <button
            style= margin: "15px", width: "150px" 
            type="button"
            className="btn btn-danger"
            onClick=() => 
              this.deleteNote();
              this.props.action();
            
          >
            Delete note
          </button>
        </Card.Body>
      </Card>
    );
  


export default Note;

当我按下子组件上的按钮时,我想重新渲染我的组件...

【问题讨论】:

你怎么知道它没有重新渲染?您是否尝试将console.log 放入render 函数中? 【参考方案1】:

与其将 this.props.action 放在按钮中,不如尝试将其放在 deleteNote 中。

deleteNote = _ => 
this.props.action()
const prp = this.props.details;
fetch(`http://localhost:4000/notes/delete?note_id=$prp.note_id`).catch(
  err => console.error(err)
);

;

【讨论】:

它不起作用:/我应该注意我的组件是基于从 api 获取的数据。也许这就是它不起作用的原因......我的意思是可能必须重新触发 componentDidMount 或其他什么? 啊,废话,我不确定,你能不能试着把整个 deleteNote 扔到父组件里,然后把它传下去?【参考方案2】:

所以我认为我无法解决我的问题,因为数据是从我的 api 中获取的。当我单击我的按钮时,它会发送删除 mysql 上特定行的请求。但我猜反应并没有反映我的数据..所以真的是重新渲染..但是使用完全相同的数据..我决定设置一个方法来切片我的对象数组,这很好:

  updateNotes = key => 
    var newArray = [];
    var  notes  = this.state;
    for (var i = 0; i < notes.length; i++)
      if (notes[i].note_id !== key) newArray.push(notes[i]);
    this.setState(
      notes: newArray
    );
  ;

【讨论】:

以上是关于组件未在 setState React 上重新渲染的主要内容,如果未能解决你的问题,请参考以下文章

React Native this.setState() 仅在再次与组件交互后重新渲染

React setState 不重新渲染组件

React setstate 只能更新挂载或挂载的组件——在重新渲染时

React - 当 Axios 在单独的组件中调用时,setState 不会重新渲染页面

React 6/100 React原理 | setState | JSX语法转换 | 组件更新机制

React生命周期, setState、props改变触发的钩子函数