我们可以在反应中访问无状态组件之外的功能吗?

Posted

技术标签:

【中文标题】我们可以在反应中访问无状态组件之外的功能吗?【英文标题】:Can we access functions outside of stateless component in react? 【发布时间】:2021-05-13 21:14:54 【问题描述】:

试图从外部调用模态函数,但不可能。使用静态方法和属性通过类组件实现,但 this 将无法在那里工作。观察者给出了一些问题,最终登陆无状态组件。我们如何才能最好地完成这项工作?

//Inside
import Modal from './modal';
   // Not working
   <Button onClick=Modal.showModal
<Modal />


//Outside

export const Modal = () => 
  const [visible, setVisible] = useState(false);

  const showModal = () => 
     setVisible(true);
  
  return(
     <Dialog visible=visible>Hello Test</h1>
  )

【问题讨论】:

这就是为什么会有像解决方案这样的状态管理。在您的情况下,您可以简单地使用 useContext 这里怎么用? ***.com/questions/37949981/… 请看这个链接。 This 可以帮忙,如果卡住我会添加解决方案 【参考方案1】:

你可以在父组件中声明 setVisible:

  const [visible, setVisible] = useState(true);

然后将set函数传递给Modal:

 <Modal visible=visible setVisible=setVisible />

设置从外部可见:

  <button onClick=() => setVisible(!visible)>Click</button>

示例:https://codesandbox.io/s/competent-bassi-x3dqd?file=/src/App.js:267-325

【讨论】:

感谢您的回复,但是有没有比这个更好的解决方案而不是道具?因为组件已经安装并且状态应该改变调用内部的函数【参考方案2】:

您需要将"lift the state up" 传递给将状态和状态处理程序传递给其子级的组件,或者使用reduxcontext 的一些全局状态。

示例:

&lt;App&gt;

import Modal from "./modal";
import  useState  from "react";

const [visible, setVisible] = useState(false);

const showModal = () => 
  setVisible(true);
;

return (
  <> 
    <Button onClick=showModal> Hide Modal </Button>
    <Modal visible=visible />
  </>
);

&lt;Modal&gt;

export default const Modal = ( visible ) => 
  return (
    <Dialog visible=visible>
      <h1>Hello Test</h1>
    </Dialog>
  );
;

此外,仅使用export 关键字,您只能从模块导入单个导出,因此您不能使用默认导入语法import Modal from "..." 并且您将被要求这样导入 - import Modal from '...'

【讨论】:

还有很多状态设置,所以我应该调用一个函数,以便内部函数在没有redux的情况下更新本地状态【参考方案3】:

我在这里设法解决了 usingEffect,但不确定这是否适合我的实现。我正在尝试更新已安装组件的状态。

useEffect(() => 
    if (props.visible) 
      showModal();
    
  , [props.visible]);

并使用回调属性处理 resetState

【讨论】:

以上是关于我们可以在反应中访问无状态组件之外的功能吗?的主要内容,如果未能解决你的问题,请参考以下文章

反应无状态子组件不会更新父组件中的状态更改

javascript 反应无状态功能组件模板

如何在有状态或无状态小部件之外访问 BuildContext?

如何在 TypeScript 中使用带有 React 无状态功能组件的子组件?

使用带有反应的无状态组件的打字稿

所有视图都应该是无状态组件吗?