我只是try 创建一个Reaction Native库,目前我有一个可以用来声明我的函数的用例

  • const show = useMyHook()

  • const {show, hide} = useMyHook()

useMyHook.js

const useMyHook = () => {
  const MyCTX = useContext(MyContext);
  if (!MyCTX) {
    throw new Err或('useMyHook must be defined.');
  }
  // how do i conditionally return
  // return {show: MyCTX.show, hide:MyCTX.hide}
  // and
  // return MyCTX.show
  return MyCTX.show;
};

exp或t default useMyHook;

what should i do to make useMyHook() accept both of them? 或 is it not possible?

我希望useMyHook()可以接受这两个变量的主要原因是,当开发人员只想调用show()作为函数时,可以将任何东西命名为变量,如下所示:

const showMyHookInBannerHomepage = useMyHook()

i think it's m或e simple rather than

const {show:showMyHookInBannerHomepage} = useMyHook()

推荐答案

我能想到的一种方法是,通过返回一个附加了属性的函数,使钩子同时适用于这两种用例.类似于:

function useMyHook() {
  const MyCTX = useContext(MyContext);
  if (!MyCTX) {
    throw new Error("useMyHook must be defined.");
  }

  // Create a function that calls MyCTX.show
  const callableFunction = function() {
    return MyCTX.show();
  };

  // Attach show and hide properties to the function
  callableFunction.show = MyCTX.show;
  callableFunction.hide = MyCTX.hide;

  return callableFunction;
}

// Usage 
// Either
const { show, hide } = useMyHook();
// Or
const show = useMyHook();

一百零二


Alternative Approach

另一种方法是要求您对钩子使用一个参数(如果您想要更改钩子的签名),您可以基于该参数有条件地使用它们.示例将如下所示:

const useMyHook = (returnObject = false) => {
  const MyCTX = useContext(MyContext);
  if (!MyCTX) {
    throw new Error('useMyHook must be defined.');
  }
  // Conditionally return based on the `returnObject` parameter
  if (returnObject) {
    return {show: MyCTX.show, hide: MyCTX.hide};
  } else {
    return MyCTX.show;
  }
};

// To use

// Just get the `show` function
const show = useMyHook();

// Get both `show` and `hide` functions in an object
const {show, hide} = useMyHook(true);

SIDENOTE:

  1. 您还可以利用101来实现您的要求.尽管如此,它可能存在一些性能瓶颈(如果您准备牺牲一些),因为它拦截并重新定义对象上的操作.
  2. 如果没有非常具体的需要,我会坚持使用分解方法,并将其留给开发者(使用钩子),因为他们想要从钩子中分解.

Javascript相关问答推荐

为什么我的includes声明需要整个字符串?

防止用户在selectizeInput中取消 Select 选项

MongoDB中的引用

将2D数组转换为图形

为什么我的列表直到下一次提交才更新值/onChange

为什么!逗号和空格不会作为输出返回,如果它在参数上?

从Node JS将对象数组中的数据插入Postgres表

我创建了一个创建对象的函数,我希望从该函数创建的对象具有唯一的键.我怎么能做到这一点?

当id匹配时对属性值求和并使用JavaScript返回结果

NG/Express API路由处理程序停止工作

为什么客户端没有收到来自服务器的响应消息?

如何在FastAPI中为通过file:/URL加载的本地HTML文件启用CORS?

自定义图表工具提示以仅显示Y值

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

使用自动识别发出信号(&Q)

如何根据输入数量正确显示alert ?

如何在Reaction中清除输入字段

限制数组中每个元素的长度,

Played link-Initialize.js永远显示加载符号

检测带有委托的元素内部的点击,以及元素何时按其类名被选中