当前位置: 首页 > news >正文

React@16.x(14)context 举例 - Form 表单

目录

  • 1,目标
  • 2,实现
    • 2.1,index.js
    • 2.2,context.js
    • 2.2,Form.Input
    • 2.3,Form.Button
  • 3,使用

1,目标

上篇文章说到,context 上下文一般用于第3方组件库,因为使用场景是需要多个组件之间相互配合实现一整套的逻辑。(高内聚的思想)

所以利用上下文的特性简单封装一个表单,看看如何实现和使用。

在 element-ui 中 Form 表单组件之间的联动,也是一个思想。它使用的 发布订阅模式 来逐层传递数据。

2,实现

整体目录:

src/components/Form
-- index.js
-- context.js // 存放上下文数据。
-- FormInput.js
-- FormButton.js

2.1,index.js

import React, { Component } from "react";
import PropTypes from "prop-types"; // 用于验证 props 类型
import { Provider } from "./context";
import FormInput from "./FormInput";
import FormButton from "./FormButton";export default class Form extends Component {state = {formData: {},changeFormData: (name, value) => {this.setState({formData: {...this.state.formData,[name]: value,},});},submit: () => {this.props.onSubmit?.(this.state.formData);},};static propTypes = {onSubmit: PropTypes.func,};render() {return <Provider value={this.state}>{this.props.children}</Provider>;}
}// 赋值到 Form 组件上方便引用。
Form.Input = FormInput;
Form.Button = FormButton;

2.2,context.js

import React from "react";const ctx = React.createContext();
export const { Provider, Consumer } = ctx;
export default ctx;

2.2,Form.Input

注意 input.value 属性,因为 this.context.formData[this.props.name] 一开始是 undefined,所以得加一个默认值 '',否则 React 会认为是非受控组件而报错。

import React, { Component } from "react";
import PropTypes from "prop-types";
import ctx from "./context";export default class FormInput extends Component {static contextType = ctx;static defaultProps = {type: "text",};static propTypes = {type: PropTypes.string.isRequired,name: PropTypes.string.isRequired,};render() {return (<div><inputtype={this.props.type}name={this.props.name}value={this.context.formData[this.props.name] || ""}onChange={(e) => {this.context.changeFormData(this.props.name, e.target.value);}}></input></div>);}
}

2.3,Form.Button

import React from "react";
import { Consumer } from "./context.js";export default function FormButton(props) {return (<Consumer>{(ctx) => {return <button onClick={() => ctx.submit()}>{props.children}</button>;}}</Consumer>);
}

3,使用

import React, { Component } from "react";
import Form from "./components/Form/index";export default class App extends Component {render() {return (<div><FormonSubmit={(formData) => {console.log(formData);}}><div><label>用户名</label><Form.Input name="id"></Form.Input></div><div><label>用户名</label><Form.Input name="pwd" type="password"></Form.Input></div><Form.Button>获取FormData</Form.Button></Form></div>);}
}

最终,点击按钮就能获取到 formData更新后的数据。


以上。

相关文章:

React@16.x(14)context 举例 - Form 表单

目录 1&#xff0c;目标2&#xff0c;实现2.1&#xff0c;index.js2.2&#xff0c;context.js2.2&#xff0c;Form.Input2.3&#xff0c;Form.Button 3&#xff0c;使用 1&#xff0c;目标 上篇文章说到&#xff0c;context 上下文一般用于第3方组件库&#xff0c;因为使用场景…...

十几款基于ChatGPT的免费神器,每个都是王炸!

十几款基于ChatGPT的免费神器&#xff0c;每个都是王炸&#xff01; 1、ChatGPT ChatGPT非常强大&#xff0c;但注册需要魔法和国外的手机号&#xff0c;大部分人都没法使用。还好有一些基于API开发的体验版&#xff0c;我收集了一些可以直接使用的站点分享给大家&#xff0c…...

devicemotion 或者 deviceorientation在window.addEventListener 事件中不生效,没有输出内容

问题&#xff1a;devicemotion 或者 deviceorientation 在window.addEventListener 事件中不生效&#xff0c;没有输出内容 原因&#xff1a; 1、必须在Https协议下才可使用 2、必须用户手动点击click事件中调用 &#xff0c;进行权限申请 源码&#xff1a; <!DOCTYPE h…...

java单元测试如何断言异常

​ 在junit单元测试中&#xff0c;我们可以使用 org.junit.Assert.assertThrows 包下的 assertThrows() 方法 这个方法返回了一个泛型的异常 public static <T extends Throwable> assertThrows(Class<T> expectedType, Executable executable)​ 假设我们有以下…...

C语言| n的阶乘相加

逻辑性较强&#xff0c;建议记住。 分析思路&#xff1a; 假如n4&#xff1a;m m * i; sum sum m; 1&#xff09;当i1时&#xff0c;m1, sum1。 2&#xff09;当i2时&#xff0c;m12, sum112。 3&#xff09;当i3时&#xff0c;m123, sum112123。 4&#xff09;当i4时&…...

cwiseMax、cwiseMin函数

一、cwiseMax含义 cwiseMax是Eigen库中的一个函数&#xff0c;用于求两个矩阵或向量的逐元素最大值。它的作用类似于std::max函数&#xff0c;但是可以同时处理多个元素&#xff0c;且支持矩阵和向量。 举例&#xff1a; 例如&#xff0c;对于两个向量a和b&#xff0c;cwiseMax…...

【thinkphp问题栏】tp5.1重写URL,取消路径上的index.php

在Apache运行thinkphp5.1时&#xff0c;发现系统默认生成的.htaccess不生效。 首先先查看怎么修改伪静态 1、修改Apache的配置文件 在Apache的安装目录下&#xff0c;打开config/httpd.conf。 搜索rewrite.so&#xff0c;将前面的#删掉&#xff0c;表示开启URL重写功能 2、…...

缓冲字符流

BufferedReader/BufferedWriter增加了缓存机制&#xff0c;大大提高了读写文本文件的效率。 字符输入缓冲流 BufferedReader是针对字符输入流的缓冲流对象&#xff0c;提供了更方便的按行读取的方法&#xff1a;readLine();在使用字符流读取文本文件时&#xff0c;我们可以使…...

Django中使用Celery和APScheduler实现定时任务

在之前的文章我们已经学习了Celery和APScheduler的基本使用&#xff0c;下面让我们来了解一下如何在Django中使用Celery和APScheduler Celery 1.前提工作 python 3.7 pip install celery pip install eventlet #5.0版本以下 pip install importlib-metadata4.8.3&#xff08…...

Kivy.uix.textinput

一个小小的输入框&#xff0c;纵上下数页文档已不能全不概括&#xff0c;当去源码慢慢寻找&#xff0c;才知道其中作用&#xff0c;才能运用灵活。 Text Input — Kivy 2.3.0 documentation # -*- encoding: utf-8 -*-Text Input .. versionadded:: 1.0.4.. image:: images/te…...

基于IoTDB 平台的学习和研究

Apache IoTDB&#xff08;物联网数据库&#xff09;是一个针对物联网领域的高性能原生数据库&#xff0c;适用于数据管理和分析&#xff0c;并可在边缘计算和云端部署。由于它轻量级的架构、高性能和丰富的功能集&#xff0c;以及与Apache Hadoop、Spark和Flink的深度集成&…...

nessus plugins目录为空的问题

想要避免这种问题&#xff0c;可以将nessus服务设置为手动&#xff0c;并且先停止nessus服务。 批处理脚本&#xff1a; 下面的/~/Nessus/plugin_feed_info.inc替换成你配置好的 plugin_feed_info.inc 所在的路径 service nessusd stop; cp /~/Nessus/plugin_feed_info.inc …...

FDW(Foreign Data Wrapper)

在上一篇博客里&#xff0c;最末尾提到了 FDW。pg 实现了数百个 fdw 插件&#xff0c;用于访问外部数据。 FDW 到底是什么呢&#xff1f; 标准 FDW&#xff08;Foreign Data Wrapper&#xff09;遵循了 SQL/MED 标准&#xff0c;标准全称&#xff1a;ISO/IEC 9075-9 Managem…...

Flutter开发指南

Flutter开发指南&#xff08;Android 开发角度&#xff09; 与Android 的对比 1.Android 的View 与Flutter 的对应关系&#xff1a; a.在android 中&#xff0c;view 是屏幕显示的基础&#xff0c;比如 button&#xff0c;文本&#xff0c;列表&#xff0c;输入框都是 view。…...

SpringCloud学习笔记万字整理(无广版在博客)

在此感谢黑马程序员的SpringCloud课程 所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#xff0c;请访问本篇笔记 认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐…...

c++(七)

c&#xff08;七&#xff09; 内联函数内联函数的特点为什么要有内联函数内联函数是如何工作的呢 类型转换异常处理智能指针单例模式懒汉模式饿汉模式 VS中数据库的相关配置 内联函数 修饰类的成员函数&#xff0c;关键字&#xff1a;inline inline 返回值类型 函数名(参数列…...

SQL语言

SQL语言 导航 文章目录 SQL语言导航一、SQL概述SQL 二、数据库定义SQL 数据类型 三、数据操作视图更新 四、SQL的授权五、存储过程六、嵌入式SQL主语言与数据库通信 七、动态SQL 一、SQL概述 SQL 支持三级模式结构 视图->外模式 基本表->模式 存储文件->内模式 二…...

【PPT】修改新建文本框默认字体

【PPT】修改新建文本框默认字体...

智能办公本如何选择

智能办公本如何选择 引言 随着科技的不断发展&#xff0c;智能办公本已成为现代职场人士的重要工具。它们不仅具备传统纸质笔记本的书写体验&#xff0c;还融入了先进的智能技术&#xff0c;让办公变得更加高效便捷。在选择智能办公本时&#xff0c;我们需要关注多个方面&…...

Spark基础:Scala变量与数据类型

在Scala中&#xff0c;变量和数据类型是编程的基础。Scala作为一种强大的静态类型语言&#xff0c;支持多种数据类型&#xff0c;并提供了可变&#xff08;var&#xff09;和不可变&#xff08;val&#xff09;两种类型的变量声明方式。以下是在Scala中变量和数据类型的基础知识…...

终极免费解决方案:番茄小说下载器的完整使用指南

终极免费解决方案&#xff1a;番茄小说下载器的完整使用指南 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 在数字阅读时代&#xff0c;你是否经常遇到网络小说格式不兼容、内…...

如何高效使用Umi-OCR:免费离线文字识别工具实用指南

如何高效使用Umi-OCR&#xff1a;免费离线文字识别工具实用指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语言库…...

Zotero Format Metadata:让文献元数据格式化变得简单高效

Zotero Format Metadata&#xff1a;让文献元数据格式化变得简单高效 【免费下载链接】zotero-format-metadata Linter for Zotero. A plugin for Zotero to format item metadata. Shortcut to set title rich text; set journal abbreviations, university places, and item …...

终极节点图绘制工具:Project Graph让你的思维可视化变得简单高效

终极节点图绘制工具&#xff1a;Project Graph让你的思维可视化变得简单高效 【免费下载链接】project-graph A node-based visual tool for organizing thoughts and notes in a non-linear way. 项目地址: https://gitcode.com/gh_mirrors/pr/project-graph 还在为复杂…...

从ChatGPT插件到自主Agent工作流:2026年AI工具栈跃迁的4个关键断点及突破路径

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;2026年AI工具栈搭建完整指南 构建面向生产环境的AI工具栈&#xff0c;需兼顾前沿性、稳定性与可扩展性。2026年主流实践已从单点模型调用转向模块化、可观测、可编排的智能工作流基础设施。以下为推荐技术选型…...

Cursor AI编程助手扩展包:定制化规则提升代码生成质量与效率

1. 项目概述&#xff1a;一个为 Cursor 编辑器量身定制的 AI 编程助手扩展包如果你和我一样&#xff0c;日常重度依赖 Cursor 这款“AI 驱动的代码编辑器”来提升开发效率&#xff0c;那你肯定不止一次地想过&#xff1a;能不能让 Cursor 更懂我&#xff1f;能不能让它在我写特…...

手把手教你学Simulink--电动物流车预充电路控制及主继电器粘连检测电机负载仿真

目录 手把手教你学Simulink--电动物流车预充电路控制及主继电器粘连检测电机负载仿真 摘要 Abstract 1. 引言 1.1 电动物流车发展背景 1.2 研究目的与意义 1.3 研究方法与内容 2. 文献综述 2.1 电动物流车预充电路研究现状 2.2 主继电器粘连检测技术进展 2.3 Simulin…...

【RT-DETR实战】044、Task-Aligned Assigner 原理与适配:从标签分配混乱到检测精度提升 2.3% 的实战记录

问题现场:为什么加了更好的 Backbone,mAP 反而掉了? 上周在部署 RT-DETR 的轻量化版本时遇到了一个典型问题:我把原来的 CSPDarkNet 换成了更轻、计算量更小的 GhostNet,理论上应该保持精度或微跌,但实际训练时验证集 mAP 掉了 1.5%。 排查了一圈数据增强、学习率、梯度…...

ASReview实战:用主动学习技术高效完成文献综述

1. 项目概述&#xff1a;当学术文献综述遇上主动学习如果你是一名研究生、科研人员&#xff0c;或者任何需要从海量文献中筛选出相关研究的人&#xff0c;那么“大海捞针”这个词你一定深有体会。面对动辄成千上万篇的论文标题和摘要&#xff0c;传统的人工筛选不仅耗时耗力&am…...

开源智能体技术解析:从LangChain到自主抓取,构建自动化工作流

1. 项目概述&#xff1a;从“Awesome”列表看开源智能体生态的演进 最近在梳理一些前沿的自动化工具链时&#xff0c;又翻到了 mergisi/awesome-openclaw-agents 这个仓库。对于长期关注AI Agent&#xff08;智能体&#xff09;和自动化工作流开发的同行来说&#xff0c;这类…...