当前位置: 首页 > 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更新后的数据。


以上。

http://www.lryc.cn/news/359964.html

相关文章:

  • 十几款基于ChatGPT的免费神器,每个都是王炸!
  • devicemotion 或者 deviceorientation在window.addEventListener 事件中不生效,没有输出内容
  • java单元测试如何断言异常
  • C语言| n的阶乘相加
  • cwiseMax、cwiseMin函数
  • 【thinkphp问题栏】tp5.1重写URL,取消路径上的index.php
  • 缓冲字符流
  • Django中使用Celery和APScheduler实现定时任务
  • Kivy.uix.textinput
  • 基于IoTDB 平台的学习和研究
  • nessus plugins目录为空的问题
  • FDW(Foreign Data Wrapper)
  • Flutter开发指南
  • SpringCloud学习笔记万字整理(无广版在博客)
  • c++(七)
  • SQL语言
  • 【PPT】修改新建文本框默认字体
  • 智能办公本如何选择
  • Spark基础:Scala变量与数据类型
  • php 实现:给图片加文字水印,图片水印,压缩图片
  • 免费实现网站HTTPS访问
  • vue3使用vue3-print-nb打印
  • R语言ggplot2包绘制网络地图
  • php获取今天凌晨零点的时间
  • CATIA进阶操作——创成式曲面设计入门(1)线架设计,三维点、直线、平面、曲线
  • thinkphp6中怎么查看ThinkPHP版本号
  • 第十二章 创建Web客户端
  • 调试记录-RK平台用指令开启ADB功能
  • 奇安信_NAC终端安全准入系统(相关问题整理)
  • 在iPhone上恢复已删除的Safari历史记录的最佳方法