Zustand 状态不会重新渲染组件或正确传递数据以显示过滤后的项目

如何解决Zustand 状态不会重新渲染组件或正确传递数据以显示过滤后的项目

我正在使用 Zustand 来存储状态,除此之外一切正常。当我点击歌曲按钮时,我希望它从列表中过滤出来。

目前在新加载时显示 3 首歌曲。当点击按钮时,它应该过滤(第一次过滤),但只要我点击另一个按钮再次过滤,就什么也没有发生。

因此,如果我选择/点击 Song 1Song 2,它应该只显示这些歌曲。

我认为我为此编写的逻辑是正确的,但我必须在重新渲染时做错了什么。

抱歉,我知道人们喜欢在这里上传示例,但我总是觉得 React 文件很难,所以对于这种情况,我使用 https://codesandbox.io/s/damp-waterfall-e63mn?file=/src/App.js

完整代码

import { useEffect,useState } from 'react'
import create from 'zustand'
import { albums } from './albums'

export default function Home() {
  const {
    getFetchedData,setFetchedData,getAttrData,setAttrData,getAlbumData,getButtonFilter,setButtonFilter,setAlbumData,testState,} = stateFetchData()

  useEffect(() => {
    if (getFetchedData) setAttrData(getFetchedData.Feed.entry)
  },[getFetchedData,setAttrData])

  useEffect(() => {
    setAlbumData(getButtonFilter)
  },[getButtonFilter,setAlbumData])

  // useEffect(() => {
  //   console.log('testState',testState)
  //   console.log('getAlbumData',getAlbumData)
  // },[getAlbumData,testState])

  useEffect(() => {
    setFetchedData()
  },[setFetchedData])

  return (
    <div>
      <div>Filter to Show: {JSON.stringify(getButtonFilter)}</div>

      <div>
        {getAttrData.map((props,idx) => {
          return (
            <FilterButton
              key={idx}
              attr={props}
              getDataProp={getButtonFilter}
              setDataProp={setButtonFilter}
            />
          )
        })}
      </div>

      <div>
        {getAlbumData?.Feed?.entry?.map((props,idx) => {
          return (
            <div key={idx}>
              <h1>{props.title.label}</h1>
            </div>
          )
        })}
      </div>
    </div>
  )
}

const FilterButton = ({ attr,getDataProp,setDataProp }) => {
  const [filter,setFilter] = useState(false)

  const filteralbums = async (e) => {
    const currentTarget = e.currentTarget.innerHTML
    setFilter(!filter)
    if (!filter) setDataProp([...getDataProp,currentTarget])
    else setDataProp(getDataProp.filter((str) => str !== currentTarget))
  }

  return <button onClick={filteralbums}>{attr.album}</button>
}

const stateFetchData = create((set) => ({
  getFetchedData: albums,setFetchedData: async () => {
    set((state) => ({ ...state,getAlbumData: state.getFetchedData }))
  },getAttrData: [],setAttrData: (data) => {
    const tempArr = []
    for (const iterator of data) {
      tempArr.push({ album: iterator.category.attributes.label,status: false })
    }
    set((state) => ({ ...state,getAttrData: tempArr }))
  },getButtonFilter: [],setButtonFilter: (data) => set((state) => ({ ...state,getButtonFilter: data })),testState: {
    Feed: { entry: [] },},getAlbumData: [],setAlbumData: (data) => {
    set((state) => {
      console.log('? ~ file: index.js ~ line 107 ~ state',state)
      const filter = state.getAlbumData.Feed?.entry.filter((item) =>
        data.includes(item.category.attributes.label),)

      return {
        ...state,getAlbumData: {
          ...state.getAlbumData,Feed: {
            ...state.getAlbumData.Feed,entry: filter,}
    })
  },}))

示例数据:

export const albums = {
  Feed: {
    entry: [
      { title: { label: 'Song 1' },category: { attributes: { label: 'Song 1' } } },{ title: { label: 'Song 2' },category: { attributes: { label: 'Song 2' } } },{ title: { label: 'Song 3' },category: { attributes: { label: 'Song 3' } } },],}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?