React | Hook 妙用

5 篇文章 0 订阅

一个改变颜色的Hook

import React from "react";
import useRandomColor from "./useRandomColor";
const Hook = () => {
  const [color, changeColor] = useRandomColor(["red", "blue", "green"], "red");

  return (
    <>
      <h1 style={{ color: color }}>try to change my color</h1>
      <button onClick={changeColor}>change color</button>
    </>
  );
};
export default Hook;

hook:

import React, { useState, useEffect } from "react";

const useRandomColor = (colors, initColor) => {
  const [color, setColor] = useState(initColor);
  const changeColor = () => {
		const randomIndex = Math.floor(Math.random() * colors.length);
		setColor(colors[randomIndex])
  };
  return [color, changeColor];
};
export default useRandomColor

在不需要利用state保存数据的场景(如一次性提交的非受控表单),可以封装一个ref hook。

import React, { useRef, useState } from "react";

const useRefForm = (formName, initialValue = {}) => {
  const value = useRef(initialValue);
  const [, setCount] = useState(0);

  const onChange = (key, val) => {
    // 更新某个key
    if (typeof key === "string") {
      value.current[key] = val;
    } else {
      // 传入一个对象 整个更新
      value.current = { ...value.current, ...key };
    }
  };
  const onUpdate = (key, val) => {
    // 更新某个key
    if (typeof key === "string") {
      value.current[key] = val;
    } else {
      // 传入一个对象 整个更新
      value.current = { ...value.current, ...key };
    }
    // 触发渲染
    setCount((c) => c + 1);
  };

  return {
    [formName]: value.current,
    onChangeForm: onChange,
    onUpdateForm: onUpdate,
  };
};

export default useRefForm;

use

const { holderInfo, onChangeForm, onUpdateForm } = useRefForm("holderInfo", {
  user_name: "",
  mobile: "",
  cert_type: 10,
  cert_id: ""
});

// 会更新holderInfo,但不会重新渲染,可用于非受控的input
<input name="mobile" onInput={(v)=>onChangeForm("mobile",v)}/>

// 更新holderInfo且重新渲染
<input name="mobile" onInput={(v)=>onUpdateForm("mobile",v)}/>

注:需要更新视图可调用onUpdateForm


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值