反应应用程序不会更新

问题描述 投票:0回答:2

我正在使用React JS和Airtable创建一个待办事项应用程序,它具有用于管理数据的convienent API。我是React的新手,我对JS和API的经验有限,但我已经找到了我需要做的大部分工作。

我的问题主要是基于React,因为我似乎无法让我的应用程序自动刷新。我已阅读有关React生命周期并使用this.setState()安排更新,但我一直遗漏一些东西。

这是一个精简版本,我尝试删除一个项目。

class App extends React.Component { 
  constructor(props) {
    super(props);
    this.state = {
      records: []
    };

    this.fetchAirtable = this.fetchAirtable.bind(this);
    this.deleteItem = this.deleteItem.bind(props);
    this.setState = this.setState.bind(this);   
  }    

  deleteItem(record){
    console.log("Trashing", record.fields["Title"]);
    base(table).destroy(record.id, (err, deletedRecord) => {
      if (err) { console.error(err);  return  }
    })

    this.setState({record});   
  }

  async componentDidMount() {
    await this.fetchAirtable()
  }

  async fetchAirtable() {
    const records = await base(table).select().all()
      .then( r => {return r});
    this.setState({records});
  }

  render() {
    var {records} = this.state
    return (
      <div className="App">
        {records.map(record => 
          <ul  id="tasks" key={record.id} >
            <div id="due" className="task-field">
              { record.fields["Due Date"] }
              <img src={trash}
                   className="trashcan"
                   alt="trash"
                   onClick={(e) => this.deleteItem(record, e)}
                />
             </div>
           </ul>
         )}
       </div>
     )
   }    
}

显然这不是整个项目,但想法是当您单击垃圾桶的图像时,它会删除该项目。这很好用,该项目将从Airtable数据库中删除。问题是它不会从应用程序中删除。

任何帮助,你将不胜感激!

PS。如果需要,这是我的Github目录和这个项目。

编辑1:感谢@ManavM我更新了deleteItem()。它似乎正在更新记录,但我仍然没有让我的表刷新。

  deleteItem(record){
    base(table).destroy(record.id, (err, deletedRecord) => {
      if (err) { console.error(err);  return  }
    })

    this.fetchAirtable
  }
javascript reactjs airtable
2个回答
0
投票

问题在于这部分代码

 async deleteItem(record){
    console.log("Trashing", record.fields["Title"]);
    base(table).destroy(record.id, (err, deletedRecord) => {
      if (err) { console.error(err);  return  }
      await this.fetchAirtable();
    })

    this.setState({record});   
  }

首先,你要设置{record: record},其中record键不存在。

您需要做的是在完成销毁记录后获取修改后的base(table)

另一种更有效的方法是根据您刚刚执行的操作同时修改您的状态。那是

const modifiedRecords = records.filter(rcd => rcd.id !== record.id;);
this.setState({records: modifiedRecords});

-1
投票

我已经检查了代码,您是否注意到在您的render()函数中,您已经给了var {records} = this.state,它必须是var records = this.state.records,当它不在返回时,不需要{}。

如果你确定状态得到更新但渲染函数没有重新渲染表,那么你应该尝试shouldComponentUpdate(nextProps, nextState)并返回true,如果对新状态进行了更改(仍然需要渲染)。

© www.soinside.com 2019 - 2024. All rights reserved.