【问题标题】:How do I conditionally render elements based off of path react.js如何根据路径 react.js 有条件地渲染元素
【发布时间】:2022-01-22 05:24:12
【问题描述】:

所以我正在使用 react.js 和 ruby​​ on rails 创建一个博客应用程序。我的导航组件中有这些按钮,我需要根据用户所在的路径有条件地渲染它们。我正在使用useLocation 来完成此操作,并且几乎可以将它放在我想要的位置。我遇到的问题是让它们在可以看到帖子的三个主要路径('/general'、'/resources'和'/events')中呈现,同时在用户进入帖子查看时隐藏它们厘米。如果我删除 /path/id,按钮将显示在这些路径中,但正如我所说,我需要它们不要在 /path/id 中仅呈现 /path。我怎样才能做到这一点?

const [getAllPosts, setGetAllPosts] = useState([])

useEffect(() => {
      const fetchData = async () => {
        const res = await fetchAllPosts()
        setGetAllPosts(res.filter(post => {
          return post.category.title === 'general' || post.category.title === 'resources' || post.category.title === 'events'
        }))
      }
      fetchData()
    }, [])

return (   
{getAllPosts.forEach((generalPost, resourcePost, eventsPost) => {return location.pathname === '/user' || location.pathname === '/about' || location.pathname === '/create' || location.pathname === `/general/${generalPost.id}` || location.pathname === `/general/${resourcePost.id}` || location.pathname === `/general/${eventsPost.id}` ? (<></>) : (<div className={open ? 'RegisterContainerMobileOpen' : 'RegisterContainerMobile'}>
            {currentUser ? (
              <button onClick={handleLogout} className='logoutmobile'>Logout</button>
              ) : (
              <Link to='/user' className='resgisterlinkmobile'>
                <button className='registermobile'>Signin/Signup</button>
              </Link>
            )}
          </div>)})})
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

如果您需要查看我的其余代码,请告诉我。我一直在夜以继日地工作,几乎没有睡眠,所以我觉得我错过了一些简单的东西。

编辑:我也尝试过使用.map(),但由于 map 返回了一个新数组,因此可以取回同一个按钮的多个实例。我在研究中研究了React.memo,但我不完全确定我将如何使用它,或者即使它可以解决映射问题

注意:在阅读了有关 React.memo 的更多文档后,这似乎没有帮助

【问题讨论】:

    标签: reactjs react-hooks path conditional-statements rendering


    【解决方案1】:

    在不深入研究任务的情况下,尝试添加return,而不是forEach,使用map。请记住,forEach 不会返回任何内容,这与 map 不同。

    所以它可能看起来像这样:

    useEffect(() => {
    ...
    }
    
    return getAllPosts.map(...
    

    【讨论】:

    • 所以我确实忘记提及我最初确实使用了.map(),但是这会隐藏原始按钮,然后根据地图创建新数组后的帖子数量重新渲染更多按钮。我正在研究React.memo 希望能解决这个问题,但我不完全确定如何使用它,或者这是否是一个解决方案。我该如何解决这个问题?
    猜你喜欢
    • 2017-03-08
    • 2020-11-06
    • 2020-04-27
    • 2021-10-04
    • 2017-12-10
    • 2021-04-28
    • 2020-03-01
    • 2020-05-21
    • 2023-03-11
    相关资源
    最近更新 更多