javascript - react - 使用 react-table 超出最大更新深度

标签 javascript reactjs react-native

尝试将 react-table 包含在一个基本应用程序中,该应用程序在字段中接受输入,当字段内容更改时将其存储在组件状态中,然后在按下按钮时从 Github 获取数据。
一切正常,直到我添加该行const tableInstance = useTable({columns, data})该页面将正常加载,但是当输入字段发生更改(即您在其中键入)时,应用程序会因错误而崩溃:
错误:超过最大更新深度。当组件在 componentWillUpdate 或 componentDidUpdate 中重复调用 setState 时,可能会发生这种情况。 React 限制了嵌套更新的数量以防止无限循环。
堆栈跟踪包括来自 react-table 库的这些片段
钩子(Hook)/useColumnVisibility.js

  204 | 
  205 | useMountedLayoutEffect(() => {
  206 |   if (getAutoResetHiddenColumns()) {
> 207 |     dispatch({ type: actions.resetHiddenColumns })
  208 | ^ }
  209 | }, [dispatch, columns])
  210 | 
和 publicUtils.js:
  153 | 
  154 | safeUseLayoutEffect(() => {
  155 |   if (mountedRef.current) {
> 156 |     fn()
  157 | ^ }
  158 |   mountedRef.current = true
  159 |   // eslint-disable-next-line
这是我的 App.js 文件中的代码
import React, { useState } from 'react';
import './App.css';
import {useTable} from "react-table"

function App() {

  const [data, setData] = useState([]);
  const [keyword, setKeyword] = useState('');

  const fetchData = () => {
    const url = `https://api.github.com/search/repositories?q=${keyword}`
    fetch(url)
      .then(response => response.json())
      .then(responseData => {
        setData(responseData.items);
      });
  }

  const handleChange = (e) => {
    setKeyword(e.target.value);
  }

  const columns = [{
    Header: 'Name', //column header 
    accessor: 'full_name' //Value accessor
  }, {
    Header: 'URL',
    accessor: 'html_url'
  }, {
    Header: 'Owner',
    accessor: 'owner.login'
  }]

  const tableInstance = useTable({columns, data}) // line causing the problem

  return (
    <div className="App">
      <input type="text" onChange={handleChange}/>
      <button onClick={fetchData} value={keyword} >Fetch</button>
    </div>
  );
}

export default App;
据推测,我做了一些事情,导致每次呈现页面时都会更新状态,从而导致另一个呈现,但我无法弄清楚它是什么。提前感谢您的帮助。

最佳答案

好的,所以我通过制作一个 Table 组件来解决这个问题,然后将其包含在 App 组件 DOM 中。
这是解决问题的更新代码

import React, { useState } from 'react';
import './App.css';
import {useTable} from "react-table"

function Table({columns, data}){

  const {
    getTableProps,
    getTableBodyProps,
    headerGroups,
    rows,
    prepareRow,
  } = useTable({columns, data})

  return (
    <table {...getTableProps()}>
      <thead>
        {
          headerGroups.map(headerGroup => (
              <tr {...headerGroup.getHeaderGroupProps()}>
                {
                  headerGroup.headers.map( column => (
                    <th {...column.getHeaderProps()}>
                      {
                        column.render('Header')
                      }
                    </th>
                  ))
                }
              </tr>
          ))
        }
      </thead>
      <tbody {...getTableBodyProps()}>
        { // loop over the rows
          rows.map(row => {
            prepareRow(row)
            return (
              <tr {...row.getRowProps()}>
                { // loop over the rows cells 
                  row.cells.map(cell => (
                    <td {...cell.getCellProps()}>
                      {cell.render('Cell')}
                    </td>
                  ))
                }
              </tr> 
            )
          })
        }
        <tr>
          <td></td>
        </tr>
      </tbody>
    </table>
  );
}

function App() {

  const [data, setData] = useState([]);
  const [keyword, setKeyword] = useState('');

  const fetchData = () => {
    const url = `https://api.github.com/search/repositories?q=${keyword}`
    fetch(url)
      .then(response => response.json())
      .then(responseData => {
        setData(responseData.items);
      });
  }

  const handleChange = (e) => {
    setKeyword(e.target.value);
  }

  const columns = [{
    Header: 'Name', //column header 
    accessor: 'full_name' //Value accessor
  }, {
    Header: 'URL',
    accessor: 'html_url'
  }, {
    Header: 'Owner',
    accessor: 'owner.login'
  }]


  return (
    <div className="App">
      <input type="text" onChange={handleChange}/>
      <button onClick={fetchData} value={keyword} >Fetch</button>
      <Table 
        columns={columns} 
        data = {data}
      />
    </div>
  );
}

export default App;
问题是我真的不知道为什么会这样,或者问题的症结是什么。

关于javascript - react - 使用 react-table 超出最大更新深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63549751/

相关文章:

javascript - 在reactjs中刷新浏览器后如何保留状态?

ios - 如何在 ios 中实现 react-native-dark-mode

javascript - 对剩余调用进行编码的最佳方法

node.js - 即使将 nodeIntegration 设置为 true,Electron window.require 也不是函数

javascript - 悬停事件的轨迹模式在 tsParticles 中不起作用(类似于 particlejs)

react-native - 场景、选项卡 (react-native-router-flux) 和图标 (react-native-vector-icons)

android - AsyncStorage 在 Android 上无法正常使用 React Native

javascript - 为什么我的复选框更改事件没有被触发?

javascript - 如何在 Backbone 模型中设置属性

javascript - 使用 js 设置可见性时检查 div 是否可见