redux 初始化常量中的参数

vbopmzt1  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(112)

我想在Redux中调度一个事件。我注意到在JavaScript中定义const有点令人困惑。当我试图直接向useAppDispatch函数添加参数时,linter标记了一个错误。

import { PlusCircleIcon } from "@heroicons/react/20/solid";
import React from "react";
import { useAppDispatch } from "../../store/hooks";

const OptionsPanelAddAction = ():JSX.Element => {
  const handleOnClick = (e: React.MouseEvent<HTMLButtonElement>):void => {
    e.preventDefault();
    useAppDispatch({type: "ADD_CLICKED"}); ---> Expected 0 arguments, but got 1
  }

  return (
    <div className="bg-white m-4 p-2 drop-shadow-sm flex justify-center">
      <div>
        <a><PlusCircleIcon className="h-6 w-6" /></a>
      </div>
    </div>
  )
}

export default OptionsPanelAddAction;

但是当我把dispatch函数放在const中时,我可以添加一个参数:

import { PlusCircleIcon } from "@heroicons/react/20/solid";
import React from "react";
import { useAppDispatch } from "../../store/hooks";

const OptionsPanelAddAction = ():JSX.Element => {
  const dispatch = useAppDispatch();

  const handleOnClick = (e: React.MouseEvent<HTMLButtonElement>):void => {
    e.preventDefault();
    dispatch({type: "ADD_CLICKED"}); ---> No Error!
  }

  return (
    <div className="bg-white m-4 p-2 drop-shadow-sm flex justify-center">
      <div>
        <a><PlusCircleIcon className="h-6 w-6" /></a>
      </div>
    </div>
  )
}

export default OptionsPanelAddAction;

有人能给我解释一下吗

j8yoct9x

j8yoct9x1#

关于const声明

const dispatch = useDispatch()没有存储constuseDispatch函数的引用,而是调用useDispatch函数并存储const对它的 * 返回值 * 的引用,即dispatch函数。
在JavaScript(and Typescript)中,声明变量const只意味着该变量不能被重新赋值,尽管它可以被改变。

const foo = {
  bar: "bizz"
};

foo = { // <-- error, can't reassign foo
  bar: "buzz"
};

foo.bar = "buzz"; // <-- OK, we can mutate the foo object

在React中,我们声明了组件变量const,以表明它们在React组件渲染周期内不会被重新分配值,即在组件渲染期间,引用不会改变。

关于useAppDispatch钩子

useAppDispatch是一个React钩子,在返回dispatch函数之前,必须先 * 自己调用 *。useAppDispatch函数不消耗任何参数。action对象传递给dispatch函数,而不是钩子。

不工作

useAppDispatch({ type: "ADD_CLICKED" });

工作

const dispatch = useAppDispatch();

...

dispatch({ type: "ADD_CLICKED" });

虽然你可以尝试像useAppDispatch()({ type: "ADD_CLICKED" });这样的东西,但我不推荐这样做,因为它不是一个常用的模式,可能会损害可读性/可维护性,甚至可能会破坏你可能试图调用它的Rules of Hooks

4ktjp1zp

4ktjp1zp2#

useAppDispatch是一个钩子,它从Redux store返回一个对dispatch函数的引用。医生来了
你必须调用钩子,然后你可以像这样使用引用:

const dispatch = useAppDispatch()
dispatch({type: "ADD_CLICKED"});

相关问题