【问题标题】:Custom react hook useToggle in TypescriptTypescript中的自定义反应钩子useToggle
【发布时间】:2020-02-13 10:39:57
【问题描述】:

我为切换布尔值和值编写了自定义钩子:

import { useState } from 'react';

export function useToggle(initialValue: boolean) {
  const [value, setValue] = useState<boolean>(initialValue);

  const toggleValue = () => setValue(!value);

  return [value, toggleValue];
}

然后我像下面这样使用它:

 const [modalOpen, setModal] = useToggle(false);

但得到错误:

键入'布尔值| (() => void)' 不能分配给类型 'boolean | ((() => 无效) & 假) | ((() => void) & true)'。键入'() => void' 不能分配给类型 'boolean | ((() => 无效) & 假) | ((() => 无效)&真)'。 类型 '() => void' 不能分配给类型 '(() => void) & false'。 类型 '() => void' 不能分配给类型 'false'。

【问题讨论】:

标签: reactjs typescript react-hooks


【解决方案1】:

您可能需要定义挂钩的返回类型。它应该看起来像这样。

import { useState } from 'react';

export function useToggle(initialValue: boolean): [boolean, () => void] {
  const [value, setValue] = useState<boolean>(initialValue);

  const toggleValue = () => setValue(!value);

  return [value, toggleValue];
}

【讨论】:

    【解决方案2】:

    const {useRef, useState} = React;
    
    function useToggle(initialState){
      const [value, setValue] = useState(initialState);
      const toggle = () => { setValue(!value) };
      
      return [value, toggle];
    };
    
    function App(){
      const [modal, setModal] = useToggle(false);
      return (
        <div>
          <button onClick={setModal}>Toggle!</button>
          {modal && <span>Toggle!!!!</span>}
        </div>
      )
    }
    
    ReactDOM.render(
      <App />, document.getElementById('root')
    )
    <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <div id="root"></div>

    【讨论】:

    • 这些脚本有什么作用?我们为什么需要它们?
    • 那是React作为CDN!你不需要关心这些,你只需要看到关于你的代码
    • 但是你什么都没改,还是有错误
    • @heisenberg7584 我刚刚用{} 包裹了toggle()。你喜欢它吗?
    猜你喜欢
    • 2021-12-02
    • 2019-06-15
    • 1970-01-01
    • 2020-03-08
    • 2022-07-18
    • 1970-01-01
    • 2021-09-29
    • 2020-07-18
    • 2020-09-06
    相关资源
    最近更新 更多