如何使特定按钮在 React.js 上永久消失?

Posted

技术标签:

【中文标题】如何使特定按钮在 React.js 上永久消失?【英文标题】:How to make a specific button disappear permanently on React.js? 【发布时间】:2021-06-30 20:17:30 【问题描述】:

我试图让一个按钮在点击后消失,这样即使我转到不同的组件(不同的页面)它也会保持这种状态。

代码如下:

<Button
  className="but"
  variant="primary"
  onClick=(e) => 
    const tr = 
      id: info.track.track_id,
      trackName: info.track.track_name,
      artistName: info.track.artist_name,
    ;

    fetch('http://localhost:8000/blogs', 
      method: 'POST',
      headers:  'Content-Type': 'application/json' ,
      body: JSON.stringify(tr),
    ).then(() => 
      console.log('blog added');
    );
  
  style= marginLeft: '6px' 
>
  Mark
</Button>;

【问题讨论】:

【参考方案1】:

您需要在全局状态下管理button 的显示或从按钮的父组件处理它。

像这样:

import React,  useState  from 'react';

const ParentComponent = () => 
  const [showButton, setShowButton] = useState(false);

  return (
    <>
      showButton && (
        <Button
          className="but"
          variant="primary"
          onClick=(e) => 
            const tr = 
              id: info.track.track_id,
              trackName: info.track.track_name,
              artistName: info.track.artist_name,
            ;

            fetch('http://localhost:8000/blogs', 
              method: 'POST',
              headers:  'Content-Type': 'application/json' ,
              body: JSON.stringify(tr),
            ).then(() => 
              console.log('blog added');
              setShowButton(false)
            );
          
          style= marginLeft: '6px' 
        >
          Mark
        </Button>
      )
    </>
  );
;

要在全局级别管理状态,您可以使用 React.Context API

首先,像这样在您的根应用中创建 ButtonContext

const ButtonContext = React.createContext(
  showButton: true,
  setShowButton: (show) => 
);

将它包裹在你的根 App 周围,并使用 useState 钩子将 showButton 的值作为 true 传递

const [showButton, setShowButton] = useState(true);

<ButtonContext.Provider value= showButton, setShowButton >
  <App />
</ButtonContext.Provider>

然后像这样在您的ButtonParentComponent 中使用它

import React,  useContext  from 'react';

const ParentComponent = () => 
  const showButton, setShowButton = useContext(ButtonContext);

  return (
    <>
      showButton && (
        <Button
          onClick=() => 
            // do your click stuff and
            // reset the showButton context value
            setShowButton(false)
           
          
        >
        </Button>)
    </>
  )

【讨论】:

按钮位于地图内,因此有多个按钮。因此,您的答案将影响所有按钮,而不是单击的按钮。对吗? 如果它在地图中并且您只想隐藏单击的按钮,那么它是不同的实现。 如果您正在寻找,我可以更新我的答案吗? 同时分享更多调用按钮的父组件代码 我刚刚发布了一个与此不同的新答案。检查一下,让我知道它是否有效?【参考方案2】:

use 可以使用 state 来隐藏按钮之类的东西

 showButton && (
   < Button className="but" variant="primary" onClick=(e)=>
const tr=id:info.track.track_id,trackName:info.track.track_name,artistName:info.track.artist_name

fetch('http://localhost:8000/blogs',
 method:'POST',
 headers: "Content-Type": "application/json",
 body: JSON.stringify(tr)
  ).then(()=>
  console.log("blog added");
    setShowButton(false);
 );
             style= marginLeft:"6px" >Mark</Button>
)

【讨论】:

我已经尝试过了,但它隐藏了所有按钮。 嗯,也许可以尝试添加一个 css 类进行显示:无;到需要隐藏的特定按钮,然后在需要切换它们时切换类?您如何知道地图中哪些按钮需要显示,哪些不需要? 我有多张卡片,每张卡片都有一个按钮,如果我点击按钮,卡片就会进入收藏列表。明白了吗?【参考方案3】:

如果您想为用户永久隐藏它,那么您必须在后端某处注册该用户活动。然后发送一个 http 请求,这样您就可以获取数据,如果用户可以再次执行该活动。根据您设置某些状态的响应,然后您可以从该状态隐藏/显示按钮。

import React,  useEffect, useState  from 'react'

const App = () => 
  const [showButton, setShowButton] = useState(false);

  useEffect(() => 
    fetch('http://localhost:8000/can-user-perform-activity-again')
      .then((response) => response.json())
      .then((response) => 
        if(response.yes)
          setShowButton(true)
         
        if(response.no)
          setShowButton(false);
        
      )
  , []);

  return (
    <div>
      showButton && <button>Vote</button>
    </div>
  )


export default App

【讨论】:

按钮位于地图内,因此有多个按钮。如何设置状态以便识别特定按钮?? 这些按钮是干什么用的? 我有多张卡片,每张卡片都有一个按钮,如果我点击按钮,卡片就会进入收藏列表。明白了吗?【参考方案4】:

由于Button 在地图中呈现,您可以从现有按钮创建一个自定义按钮组件,用于管理hide 状态并返回实际的Buttonnull

自定义按钮应如下所示:

const CustomButton = ( info ) => 
  const [hide, setHide] = useState(false);

  return hide ? (
    <Button
      className="but"
      variant="primary"
      onClick=(e) => 
        const tr = 
          id: info.track.track_id,
          trackName: info.track.track_name,
          artistName: info.track.artist_name,
        ;

        fetch('http://localhost:8000/blogs', 
          method: 'POST',
          headers:  'Content-Type': 'application/json' ,
          body: JSON.stringify(tr),
        ).then(() => 
          console.log('blog added');
          setHide(false);
        );
      
      style= marginLeft: '6px' 
    >
      Mark
    </Button>
  ) : null;
;

您可以在您的.map() 中使用它并将info 作为props 传递给它。

像这样:

data.map((info) => (
  <CustomButton
    key=info.track.track_id
    info=info
  />)
)

【讨论】:

有点用,但是当我转到不同的页面时,按钮又回来了 然后使用React.Context API 来全局管理状态,这样当您导航到不同的组件时,它就不会返回。检查我的其他答案以了解如何做到这一点。

以上是关于如何使特定按钮在 React.js 上永久消失?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 ChildViewController 在相同的按钮操作上出现和消失

如何使按钮在 Unity 中消失?

悬停时如何使引导按钮消失

单击iOS / xcode后如何使按钮消失?

在情节提要上使用 UIButton 子类会使按钮的边框消失

如何在自定义 ListView 中设置按钮的可见性?