我想知道为什么控制台.日志(log)({routes})正在搜索useState更新时输出,而搜索没有过滤数据.我已经记住并使用了回调的东西.

import { memo, useCallback, useMemo, useState } from 'react'

import * as stations from './stations.json'
import './App.css';

const StyledContainer = {
  "cursor": "pointer",
  "display": "flex",
  "flex-direction": "row"
}

const StyledSegment = {
  "justify-content": "space-between",
  "text-align": "left",
  "width": "33.3%"
}

const baseUrl = 'https://api.wheresthefuckingtrain.com/by-id'

const StationComponent = (fetchSchedule, s) => {
  const { id, location, name, routes = false, stops } = s

  console.log({ routes }) // THIS RERENDERS

  return (
    <div key={id} onClick={() => { fetchSchedule(id) }}>
      <h3>{name}</h3>
      <h4>{location}</h4>
      {routes && routes.N.length > 0 && <div><label>North</label><ul>{routes.N.map(({ route, time }, idx) => <li key={idx}>Route: {route}<br></br>{new Date(time).toLocaleTimeString()}</li>)}</ul></div>}
      {routes && routes.N.length > 0 && <div><label>South</label><ul>{routes.S.map(({ route, time }, idx) => <li key={idx}>Route: {route}<br></br>{new Date(time).toLocaleTimeString()}</li>)}</ul></div>}
    </div>
  )
}

const MemoizedStationComponent = memo(StationComponent)

function App() {
  const [filteredStationData, setFilteredStationData] = useState(stations)
  const [search, setSearch] = useState() // station name
  const [stationData, setStationData] = useState(stations)

  console.log({stations})

  const fetchSchedule = useCallback(async (id) => {
    const res = await fetch(`${baseUrl}/${id}`, { method: 'get' })
    const json = await res.json()

    console.log("apiCall")

    const copyStationData = JSON.parse(JSON.stringify(stations))
    copyStationData[id].routes = json.data[0]

    setStationData(copyStationData)
  })

  const filterStations = useCallback(() => {
    const filteredStations = Object.values(stationData).filter((s) => s.name.includes(search))
    setFilteredStationData(filteredStations)
  })

  return (
    <div className="App" style={StyledContainer}>
      <header className="App-header">
        <input placeholder="Name" onChange={(e) => { setSearch(e.target.value) }} /><button onClick={() => { filterStations() }}>Search</button>
        <div style={StyledSegment}>
          {Object.values(filteredStationData).map(s => <MemoizedStationComponent fetchSchedule={fetchSchedule} s={s} />)}
        </div>
      </header>
    </div>
  );
}

export default App;

推荐答案

只需为useCallback添加依赖项,以防止不必要地重新呈现station组件.

const fetchSchedule = useCallback(async (id) => {
  const res = await fetch(`${baseUrl}/${id}`, { method: 'get' })
  const json = await res.json()

  console.log("apiCall")

  const copyStationData = JSON.parse(JSON.stringify(stations))
  copyStationData[id].routes = json.data[0]

  setStationData(copyStationData)
}, [stations])

const filterStations = useCallback(() => {
  const filteredStations = Object.values(stationData).filter((s) => s.name.includes(search))
  setFilteredStationData(filteredStations)
}, [search])

现在,每次更改站点或搜索值时.组件将重新渲染.

Javascript相关问答推荐

从连接字符串创建客户端时,NodeJS连接到CosmosDB失败

如何在RTK上设置轮询,每24小时

docx.js:如何在客户端使用文档修补程序

判断表格单元格中是否存在文本框

Mongoose post hook在使用await保存时不返回Postman响应

在grafana情节,避免冲突的情节和传说

如果Arrow函数返回函数,而不是为useEffect返回NULL,则会出现错误

使用ThreeJ渲染的形状具有抖动/模糊的边缘

这个值总是返回未定义的-Reaction

当代码另有说明时,随机放置的圆圈有时会从画布上消失

在验证和提交表单后使用useNavigate()进行react 重定向,使用带有加载器和操作的路由

Phaser3 preFX addGlow不支持zoom

如何组合Multer上传?

通过跳过某些元素的对象进行映射

在SuperBase JS客户端中寻址JSON数据

Clip-Path在网页浏览器(Mozilla、Edge、Chrome)上不能正常工作,但在预览版Visual Code Studio HTML、CSS、JS上却能很好地工作

为什么NULL不能在构造函数的.Prototype中工作

在HTML中使用meta标记来指定定制元数据以用于使用JavaScript进行检索是不是一个坏主意?

如何缩小函数中联合返回类型的范围

调试jQuery代码以获取所有行的总和(票证类型)