2-2-8 React Hooks 封装公用组件

Posted 沿着路走到底

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2-2-8 React Hooks 封装公用组件相关的知识,希望对你有一定的参考价值。

依赖属性渲染的组件

有时候组件不需要有内部状态,状态完全由外部提供,这样可以进行简单封装。

const Button = (text : 
    text : string
) => 
	return <button>text</button>    

受控输入组件

const Input = (value,onChange : 
    value : string,
    onChange : Function
) => 
    return <input onChange=onChange value=value />

有时一个组件的输入完全依赖于属性,这样的组件内部没有状态,完全受到外部的控制,这样的组件是受控组件。 受控组件的优势是设计简单,缺点是增加了更新路径的长度(最小知识原则)。

value的更新需要外部驱动(props.value),而又需要从内部传出去(onChange)。外部需不需要知道这次更新且不说,上面的例子中用户每次的按键都需要尽快通知外部,比如不可以这样写。

const Input = (value,onChange : 
    value : string,
    onChange : Function
) => 
    return <input onChange=debounce(onChange, 300) value=value />

非受控输入组件

非受控组件会维护内部状态,外部只提供初始值。

const UnControlledInput = (defaultValue,onChange : 
  defaultValue : string,
  onChange? : Function
) => 
  const [value, setValue] = useState<string>(defaultValue)
  
  useEffect(() => 
    if(value !== defaultValue) 
      onChange && onChange(value)          
    
  , [value])
  
  return <input onChange=e => 
    setValue(e.target.value)        
   value=value />

非受控组件内部维护了状态,因此外部只需要传入初始值,这样就不需要利用外部属性来驱动组件更新。从最小知识原则来看,这样外部的设计可以得到大大的简化。

兼容受控和非受控组件

当然在封装组件的时候,往往需要同时支持两种行为,那么可以这样做:

const MixedControlInput = (
  defaultValue,
  value,
  onChange,
: 
  value ? : string,
  defaultValue ? : string,
  onChange ? : Function
) => 
  const controlled = typeof value !== 'undefined'
  const [_value, setValue] = useState<string>(controlled ? value : defaultValue)    
  
  useEffect(() => 
    if(value !== defaultValue) 
      onChange && onChange(value)          
    
  , [_value])
  
  return (
    <input
      onChange=(e) => 
         if(controlled) 
            onChange && onChange(e.target.value)
            return
         
         setValue(e.target.value)
      
      value=controlled ? value : undefined
      defaultValue=defaultValue
    />
  )
  

1

以上是关于2-2-8 React Hooks 封装公用组件的主要内容,如果未能解决你的问题,请参考以下文章

React Hooks的999999个好处

React+hooks+antui封装一个带搜索功能的picker

为什么叫 React Hooks

react hook介绍

react hook介绍

React16.7 hooks之setTimeout引发的bug小记