javascript - 使用 Context 进行 React State 过滤

标签 javascript reactjs state react-state-management

我正在尝试使用react-router-dom的useParams中提供的id从上下文中过滤传入的状态数组。基本上,状态到达组件并在组件中发生过滤:

import React, { useContext } from 'react';
import { Link, useParams } from 'react-router-dom';
import { DetailContext } from '../store/DetailContext';


export default function SelectedMovie() {
  const [details] = useContext(DetailContext);
  const { id } = useParams();

  if (details) {
    const [filteredDetails] = details.filter(detail => {
      return detail.id === id;
    });

    return (<div>{filteredDetails}</div>);
  } else {
    return '';
  }
}

首先,我需要在过滤之前检查状态是否已获取,因此我用 if/else 包装了组件,但我不确定这是否是一个好的做法。

有没有一种方法可以在 Context 中进行过滤,并且子组件只加载它需要的内容?我可以将 useParams ID 传递给上下文吗?

谢谢。

最佳答案

上下文可以公开一个函数,该函数将为您提供过滤后的详细信息。但是,这意味着组件不会在 details 更新时更新,仅在 id 更改时更新。

我会使用内存函数来获取过滤状态,因此只要 iddetails 不改变,该函数就会返回内存值:

export default function SelectedMovie() {
  const [details] = useContext(DetailContext);
  const { id } = useParams();

  const [filteredDetails] = useMemo(() => 
    details ? details.filter(detail => detail.id === id) : [null]
  , [details, id]);

  return filteredDetails ?
    <div>{filteredDetails}</div>
    :
    null;
}

关于javascript - 使用 Context 进行 React State 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59430819/

相关文章:

object - 一个对象可以同时参与两个状态机吗?

javascript - $ ('selector' ) 和 $ ('selector' )[0] 在 jquery 中的区别

javascript - 如何在 Express 中处理 GET 参数?

javascript - SASS 中的动态类名

reactjs - Azure 应用服务上符号链接(symbolic link)上的 yarn EPERM(不允许操作)

android - 恢复包含动态生成的 HTML 的 webview 状态

javascript - 停止对选择框中的 HTML 选项进行自动排序

reactjs - 在 NextJS 中实现本地相似/不相似功能并使其在客户端路由之间持续存在

javascript - 父组件一一返回子组件的div

c# - 在 C# 中检测 PS/2 端口状态