在Typescript中自定义react钩子useToggle

时间:2020-02-13 10:39:57

标签: reactjs typescript react-hooks

我写了用于切换boole和valuse的自定义钩子:

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);

但是会出现错误:

输入'boolean | (()=> void)'不能分配给'boolean | ((()=>无效)&false)| ((()=>无效)&true)'。输入'()=> void' 不可分配给'boolean | ((()=>无效)&false)| ((()=> 无效)和真实)”。 类型'()=> void'不能分配给类型'(()=> void)&false'。 类型'()=> void'不能分配给类型'false'。

2 个答案:

答案 0 :(得分:1)

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>

答案 1 :(得分: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];
}