react 简单的demo

news/2024/10/19 13:25:31/

实现些简单的deomo

显示时间

自定义hooks
使用定时器、生命周期、通过状态渲染更新

// hooks 文件
import { useEffect, useState } from 'react'function getDate() {let date = new Date();let year = date.getFullYear()let hour = date.getHours();let minutes = date.getMinutes();let second = date.getSeconds();let time = `${year ?? '2024'}-${hour}:${minutes}:${second}` as string;return time;
}export function UseGetTime() {const [time, setTime] = useState<string>('');useEffect(() => {setTime(getDate())return () => {clearInterval(timerId);}}, [time]);let timerId = setInterval(() => {setTime(getDate());}, 1000);return { getTime: time };
};
// time 文件
import React from 'react'import { UseGetTime } from '../hooks/time'const Time: React.FC = () => {const { getTime } = UseGetTime();return (<>{getTime}</>)
}export default Time;

表单提交

import React from "react";
import { Form, Input, Button } from 'antd'const FormDemo: React.FC = () => {const [form] = Form.useForm();const userName = Form.useWatch('username', form);const onClick = () => {console.log('提交内容', userName)}return (<Form form={form}><Form.Item name={'username'}><Input style={{ width: 160 }} placeholder={'请输入录入项'}></Input></Form.Item><Form.Item><Button onClick={onClick} type="primary">提交</Button></Form.Item></Form>)
};export default FormDemo;

表单受控组件与非受控组件

受控组件

概念:由state状态值,交给react渲染机制控值,属于受控组件
机制:state存值,用户输入 =》onChange触发 =》set值 =》引起状态改变react重新渲染
注意:这边用Form和Form.item包裹并没有什么作用,因表单项无设定name值,无法获得表单值 ,但若设定name值反而导致受控组件失效交于form表单控制

import React, { InputHTMLAttributes, useCallback, useState } from "react";
import { Form, Input, Button, Select } from 'antd'const FormDemo: React.FC = () => {type ValueType = InputHTMLAttributes<HTMLInputElement>['value'] | bigint;const [value, setValue] = useState<ValueType | string>();const [form] = Form.useForm();const onClick = () => {console.log('提交内容', value)}const onChange = (_: string, event: Record<string, any>) => {setValue(event.label); // 此用state,设置了简易的表单联动}const onchangeIn = (event: any) => {setValue(event.target.value);};return (<Form form={form}><Form.Item ><Select showSearch placeholder="请选择" onChange={onChange} options={[{value: '01',label: '男'},{value: '02',label: '女'}]}></Select></Form.Item><Form.Item><Input value={value} style={{ width: 160 }} onChange={onchangeIn} placeholder={'请输入录入项'}></Input></Form.Item><Form.Item><Button onClick={onClick} type="primary">提交</Button></Form.Item></Form>)
};export default FormDemo;
非受控组件

概念:通过default设置默认值,由用户输入,通过dom来操作值,并不依赖react,属于非受控组件
机制:用户输入=》更新值
注意: 此时给表单项设置name值,交予表单控值,再给表单项设置value是无效的

import React, { InputHTMLAttributes, useCallback, useState } from "react";
import { Form, Input, Button, Select } from 'antd'const FormDemo: React.FC = () => {const [form] = Form.useForm();const userName = Form.useWatch('username', form);const getFormValues = form.getFieldsValue();console.log('userName', userName);console.log('getFormValues', getFormValues);const onClick = () => {console.log('提交内容', userName)}const onChange = (_: string, event: Record<string, any>) => {// 赋值}const onchangeIn = (event: any) => {// 赋值};return (<Form form={form}><Form.Item name="category"><Select showSearch placeholder="请选择" onChange={onChange} options={[{value: '01',label: '男'},{value: '02',label: '女'}]}></Select></Form.Item><Form.Item name="username"><Input defaultValue={'男'} style={{ width: 160 }} onChange={onchangeIn} placeholder={'请输入录入项'}></Input></Form.Item><Form.Item><Button onClick={onClick} type="primary">提交</Button></Form.Item></Form>)
};export default FormDemo;

watch和 ProFormDependency 哪个好用?

来源:
watch 来源 Ant Plus 5 (antx)
ProFormDependency 来源 ProComponents

详解:

watch

首先,为什么这用watch而不是useWatch? 是因为useWatch本身也是由state构成,因此当局部表单更新,会导致整个组件重新渲染,造成不必要的性能消耗,如:表单实时输入获得数据,或频繁应用值
在这里插入图片描述

import React from "react";
import { Form, Input, Select } from 'antd'const FormApply: React.FC = () => {const [form] = Form.useForm();const selectForm = Form.useWatch('select', form);const inputForm = Form.useWatch('input', form);const options = [{ value: '01', label: '男' }, { value: '02', label: '女' }];console.log('form', form.getFieldsValue());console.log('整个组件渲染...')const onSelChange = () => {console.log('selectForm', selectForm);};const onInChange = () => {console.log('inputForm', inputForm);console.log('form', form.getFieldsValue());};return (<Form form={form}><Form.Item name={'select'}><Select options={options} onChange={onSelChange} /></Form.Item><Form.Item name='input' ><Input onChange={onInChange} /></Form.Item></Form>)
};export default FormApply

这时可以使用 watch 来避免性能消耗,达成局部更新,也就是说按需更新渲染
如下:

在这里插入图片描述
由图可知,并没有输出: 整个组件渲染…

import React, { ReactNode } from "react";
import { Form } from 'antd'
import { Input, Select, Watch } from 'antx'const FormApply: React.FC = () => {const [form] = Form.useForm();// const selectForm = Form.useWatch('select', form);// const inputForm = Form.useWatch('input', form);const options = [{ value: '01', label: '男' }, { value: '02', label: '女' }];console.log('form', form.getFieldsValue());console.log('整个组件渲染...')const onSelChange = () => {// console.log('selectForm', selectForm);};function fun<T>(a: T) {return a}const onInChange = () => {// console.log('inputForm', inputForm);console.log('form', form.getFieldsValue());};return (<Form form={form}><Form.Item><Select name={'select'} options={options} onChange={onSelChange} /><Watch name={'select'} >{(watchVale): ReactNode => {console.log('watchVale...', watchVale);return}}</Watch></Form.Item><Form.Item name='input' ><Input onChange={onInChange} /></Form.Item></Form>)
};export default FormApply
ProFormDependency

在这里插入图片描述
如图:表单联动,选择文本项,当输入内容后,并没有触发整组件刷新渲染

import React, { ReactNode } from "react";
import { Form } from 'antd'
import { ProForm, ProFormDependency, ProFormSelect, ProFormText } from '@ant-design/pro-components'const FormApply: React.FC = () => {const [form] = Form.useForm();const textForm = Form.useWatch('text', form);console.log('form', form.getFieldsValue());console.log('整个组件渲染...');console.log('textValue', textForm);return (<ProForm><ProFormSelect name='useMode' allowClear options={[{ value: 'select', label: '选项框' }, { value: 'text', label: '文本项' }]} /><ProFormDependency name={['useMode']} >{({ useMode }) => {if (!useMode) return null;return ((useMode === 'select') ?<ProFormSelect name='select' label={'请选择性别'} options={[{value: '01',label: '男'},{value: '02',label: '女'}]} /> : <ProFormText name='text' label={'请录入性别'} />)}}</ProFormDependency></ProForm>)
};export default FormApply

区别:
相同点: 1、都能局部渲染刷新,并不引起整个组件渲染 2、都有依赖值可作表单联动
不同点:

场景:


http://www.ppmy.cn/news/1401829.html

相关文章

【Linux实践室】Linux用户管理实战指南:用户权限切换操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;图形化界面登录2.2 &#x1f514;使用login…

夜莺浏览日志、filebeat采集日志(四)

文章目录 一、elasticsearch二、filebeat三、日志分析 一、elasticsearch docker启动 docker run -d -p 9200:9200 -p 9300:9300 --restartalways -e ES_JAVA_OPTS"-Xms512m -Xmx512m" \ -e discovery.typesingle-node -e xpack.security.enabledtrue -e ELASTIC_P…

Java算法之哈希算法

Java算法之哈希算法 哈希表 哈希表&#xff08;Hash Table&#xff09;&#xff0c;也称为散列表&#xff0c;是一种根据关键码值&#xff08;Key Value&#xff09;直接进行访问的数据结构。它通过哈希函数&#xff08;Hash Function&#xff09;将关键码值映射到哈希表中的…

使用倒模耳机壳UV树脂胶液制作HIFI耳机隔音降噪耳机壳推荐的材料和工艺流程?

对于使用倒模耳机壳UV树脂胶液制作HIFI耳机隔音降噪耳机壳&#xff0c;以下是一些推荐的材料和工艺流程&#xff1a; 材料&#xff1a; UV树脂胶液&#xff1a;选择适合倒模工艺的UV树脂胶液&#xff0c;要求具有高透明度、良好的流动性和固化性能。模具材料&#xff1a;根据…

【python】pygame游戏框架

文章目录 pygame常用模块pygame:主模块,包含初始化、退出、时间、事件等函数。pygame.cdrom 访问光驱pygame.cursors 加载光驱pygame.joystick 操作游戏手柄或者类似的东西pygame.mouse:鼠标模块,包含获取、设置、控制等函数。pygame.key 键盘模块pygame.display:显示模块…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《强沙尘暴下新能源基地的弹性评估及其提升方法 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【pytest、playwright】allure报告生成视频和图片

目录 1、修改插件pytest_playwright 2、conftest.py配置 3、修改pytest.ini文件 4、运行case 5、注意事项 1、修改插件pytest_playwright pytest_playwright.py内容如下&#xff1a; # Copyright (c) Microsoft Corporation. # # Licensed under the Apache License, Ver…

Optimizer神经网络中各种优化器介绍

1. SGD 1.1 batch-GD 每次更新使用全部的样本&#xff0c;注意会对所有的样本取均值&#xff0c;这样每次更新的速度慢。计算量大。 1.2 SGD 每次随机取一个样本。这样更新速度更快。SGD算法在于每次只去拟合一个训练样本&#xff0c;这使得在梯度下降过程中不需去用所有训…