在我的应用程序中,我有以下函数handleDeleteMessage ,它本质上与数据库和后端交互.

    const handleDeleteMessage = async (messageId) => {
        // removeMessage is a function that interacts with my backend database
        await removeMessage(chatId, messageId, userData.userId)
        return
    })

目前,函数handleDeleteMessage位于我的Chat组件内,该组件有一个也需要该函数的子组件.目前,我将handleDeleteMessage 作为prop传递给我的子组件,但是我想知道是否有一种方法可以一次定义这个函数,然后在多个组件中使用它,包括子组件.这将消除将该函数作为props 添加到每个需要该函数的子级的需要.

还要注意,ChatID是该函数的一个参数,是Chat组件本地状态的一部分(Chat组件是父组件),因此这就是我不简单地导出和导入该函数的原因.

我找到了react context,然而这似乎只是为了共享全局react state,而不是为了共享常规功能,比如handleDeleteMessage,它不属于状态.有什么潜在的解决方案吗?谢谢.

推荐答案

使用上下文传递函数,特别是在与闭包一起使用时,是将函数传递给子函数的一种非常好的方式.

下面我创建了一个非常简单的示例,如果我们有两个假装的聊天窗口,ChatScreen组件创建一个上下文,它存储props 和amp;一个函数,该函数在chatID上有一个闭包,这意味着你不需要将chatID传递给deleteMessage,所以当你点击Delete Message按钮时,你会注意到它也知道它指的是chatID.

const ChatContext = React.createContext();


function ChatHeader() {
  const {chatID} = React.useContext(ChatContext);
  return <h1>Chat Header for: {chatID}</h1>
}

function ChatBody() {
  const {chatID, deleteMessage} = React.useContext(ChatContext);
  return <div>
    ChatBody for {chatID}
    <button onClick={() => deleteMessage('delete')}>Delete Message</button>
  </div>
}

function ChatScreen(props) {
  function deleteMessage(msg) {
    console.log(`Delete message ${msg} for ${props.chatID}`);
  }
  return <div>
    <ChatContext.Provider value={{
      ...props,
      deleteMessage
    }}>
      <ChatHeader/>
      <ChatBody/>
    </ChatContext.Provider>
  </div>
}

const App = () => {
    return (
        <React.Fragment>
          <ChatScreen chatID="chat1"/>
          <ChatScreen chatID="chat2"/>
        </React.Fragment>
    );
}

ReactDOM.render(<App />, document.getElementById("react"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
<div id="react"></div>

Javascript相关问答推荐

可以的.是否可以在不预编译的情况下使用嵌套 Select 器?

如何才能拥有在jQuery终端中执行命令的链接?

vscode扩展-webView Panel按钮不起任何作用

如何在mongoose中链接两个模型?

使用useEffect,axios和useParams进行react测试

在nextjs服务器端api调用中传递认证凭证

如何添加绘图条形图图例单击角形事件

保持物品顺序的可变大小物品分配到平衡组的算法

使用POST请求时,Req.Body为空

Reaction Native中的范围滑块

如何迭代叔父元素的子HTML元素

JavaScript不重定向配置的PATH

当我try 将值更改为True时,按钮不会锁定

如何利用CSS中的隐藏元素实现平滑扩展和防止网格行间隙

JS Animate()方法未按预期工作

如何为仅有数据可用的点显示X轴标签?

如何在脚本编译后直接将RxJ模块导入浏览器(无需Angel、webpack、LiteServer)

JWT Cookie安全性

为什么我的SoupRequest";被重置为初始值,以及如何修复它?

暂停后只有一次旋转JS