react3:受控组件(表单默认变成受控)-组件通信 - typescript项目

news2024/7/6 18:23:23

受控组件:表单

  1. 非受控组件表单元素值不受所在组件状态的控制, 我们将这样的表单元素称作: 非受控组件.
  2. 受控组件受控组件 : 值受到 React 组件状态控制的表单元素一般是通过 defaultValue 属性, onChange 事件配合将非受控组件变为受控组件.
  3. 多表单元素操作 :4,5,6
  4. 给表单元素添加 name 属性,名称与 state 相同
  5. 根据表单元素类型获取对应值
  6. change 事件处理程序中通过 [name] 来修改对应的 state

通过value和onChange事件,让表单元素变成 受控组件

复选框,是否勾选 checked={ }, 配合onChange事件

获取最新input值

操作value使其变成受控组件(文本框、富文本框、下拉框)

name判断点的哪个

[ ]:可以对其中的表达式进行取值预算:取值结束,[ ] 就没有了

e.target        获取目标对象

e.target.type        获取元素类型

e.target.name        获取元素的name

e.target.type="checkbox"         获取元素的复选状态

e.target.value        获取元素的值

value获取表单元素的值

 升级:name 判断,考虑表单提交的很多元素比较麻烦

 升级:[ ] 对其中表达式取值预算,取值结束 [ ] 就没了

复选框

 

代码如下:::

import React, { Component } from 'react';
import './App.scss'
// react应用的组件有两种创建方式:函数式组件,类组件
// rcc 创建calss组件
// rsf创建函数式组件

class App extends Component {
  constructor(props){
    super(props)
    // 定义组件状态
    this.state={
      loginname:'',
      password:'',
      isread:false
    }
  }
  handleChange(e){
    console.log(e.target);
    // if (e.target.name == 'loginname') {
    //   this.setState({loginname:e.target.value})
    // }else if(e.target.name == 'password'){
    //   this.setState({password:e.target.value})
    // }

    //[] 可以对其中的表达式进行取值运算,取值结束,[] 就没有了

    // e.target  //获取目标对象
    // e.target.type  //获取元素类型
    // e.target.name //获取元素的name
    // e.target.type='checkbox' //元素的复选状态
    // e.target.value //元素的值

    // name名和state中名一样,那就可以这样简写了,一次修改所有表单元素的值 
    this.setState({[e.target.name]:e.target.type == "checkbox" ? e.target.checked : e.target.value})
  }
  login(){
    console.log(this.state);
  }
  render() {
    return (
      <div className='login'>
        <div className='block'>
            {/* 通过 value属性 和 onChange事件 让表单元素变成 受控元素 */}
            <input name='loginname' type="text" placeholder='输入账号' value={this.state.loginname} onChange={(e)=>{this.handleChange(e)}} />
        </div>
        <div className='block'>
            {/* 通过value属性 和 onChange事件 让表单元素变成 受控元素 */}
            <input name='password' type="password" placeholder='输入密码' value={this.state.password} onChange={(e)=>{this.handleChange(e)}} />
        </div>
        <div className='block'>
            {/* 通过value属性 和 onChange事件 让表单元素变成受控元素 */}
            <input name='isread' type="checkbox" checked={this.state.isread} onChange={(e)=>{this.handleChange(e)}} />勾选用户协议
        </div>
        <div className='block'>
            {/* input type=buttom 相当于提交表单 */}
            <input type="button" value='登录' onClick={()=>{this.login()}}/>
        </div>
      </div>
    );
  }
}

export default App;

 组件通信:

自定义属性:父向子传值

方法:子向父传值:本质就是一个回调函数

和vue都是写在父中导入的子组件上

//父组件向子组件传值: 父组件通过自定义属性传值给子组件, 子组件内部通过props获取值

//子组件向父组件传值: 父组件通过自定义属性传一个函数给子组件, 子组件内部通过props获取该函数并在合适的时机回调该函数完成传值.

//兄弟组件传值: 借助events库 先实例化一个公共的通信对象, 其中一个组件提前监听事件, 另一个兄弟组件在合适的时机触发事件并传值.

//跨组件传值: 借助createContext方法 先实例化一个公共的上下文通信对象, 外层组件通过Provider组件的value属性传值, 内层组件和上下文通信对象建立连接, 然后再通过this.context获取值.

父向子,子向父

兄弟组件通信:自带 events 不用装(尝试自己封装eventBus库)

使用之前要先建立eventBus文件,导入eventBus:::emit 触发事件传值,on监听,off 取消监听

emit触发传值

 

on监听,off 写在取消监听,性能优化

性能优化:取消监听。不是同一个函数名不能取消监听js中有体验:绑定函数名可以取消监听成功

 

跨组件通信:需要借助createContext方法,先实例化一个 utils文件夹下

React.createContext 实例化一个功能的通信上下文对象

创建上下文

MyContext.Provider 的value属性传值

app主文件。我的上下文

中间隔层文件

Class.contextType 和组件通信建立连接

类 构造函数

 

非嵌套组件间通信

1.利用二者共同父组件进行通信

2.使用自定义事件的方式

创建新项目typescript项目:::安装ts。

已有项目添加typescript则需要加配置项

npx create-react-app my-app --template typescript

tabbar底部导航:另类写法:主要用来子向父传递了索引,父判

import './App.scss';
// React应用的组件有两种创建方式: 函数式组件, 类组件
// rcc 创建class组件
// rsf 创建函数式组件
import React, { Component } from 'react';

import TopNav from '@/components/TopNav';
import Swiper from '@/components/Swiper';
import CateList from '@/components/CateList';
import Tabbar from '@/components/Tabbar';
import Cate from '@/components/Cate/Cate';

class App extends Component {
  constructor(props){
    super(props);
    this.state = { index:0 }
  }
  getIndex = (i)=>{
    this.setState({ index: i })
  }
  render() {
    return (
      <div>
        {/* 顶部导航 */}
        {/* 轮播图 */}
        {/* 分类导航 */}
        {
          this.state.index == 0 && 
            <>
              <TopNav />
              <Swiper />
              <CateList />
            </>
        }

        {
          this.state.index == 1 && <Cate />
        }


        {/* 底部导航 */}
        <Tabbar getIndex={this.getIndex} />

      </div>
    );
  }
}

export default App;

import React, { Component } from 'react';
import './index.scss'
class Tabbar extends Component {
    constructor(props) {
        // props和state的区别
        // 分别介绍两个技术的概念,先回答相同点,再回到不同点,最后总结一下(个人感悟,注意事项)

        // props是个对象,用来接收父组件传来的值,props默认是只读的(如果某个属性是引用类型,则引用数据的属性是可以修改)
        // state是个对象,用来定义组件自身的状态,可以通过setState来修改
        super(props)
        // 定义组件状态
        this.state = {
            tabs: [
                { text: '首页', img: '' },
                { text: '分类', img: '' },
                { text: '首页', img: '' },
                { text: '首页', img: '' },
            ],
            currentIndex: 0,
        }
    }
    handleClick(index) {
        // 回调父组件的方法
        this.props.getIndex(index)
        // this.state.currentIndex = index //这个写法可以保存数据到组件状态中,但是无法触发组件更新
        // setState会保存数据到组件状态中,同时会触发组件更新
        this.setState({ currentIndex: index }, () => {
            // 想要获取setState保存的最新状态值,必须在第二个参数的回调函数中获取(setState本身是异步的)
            // console.log('handleClick', this.state.currentIndex);
        })
    }
    render() {
        return (
            <div className='tabbar'>
                {
                    this.state.tabs.map((item, index) => {
                        return(
                            <div className={`btn ${this.state.currentIndex == index? 'active':''}`} key={index} onClick={()=>{this.handleClick(index)}}>
                                <img src={item.img} alt="" />
                                <div className='text'>{item.text}</div>
                            </div>
                        )
                    })
                }
            </div>
        );
    }
}

export default Tabbar;
.tabbar{
    position: fixed;
    bottom: 0;
    width: 100%;
    display: flex;
    justify-content: space-around;
    align-items: center;
    margin: 15px;
    border-top: 1px solid #ccc;
    .btn.active{
        color: red;
        font-weight: bold;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/417516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如果当前node.js版本和项目需要版本不一样,卸载重装其他版本node.js的方法

其实这种node.js版本不一样的问题&#xff0c;可以选择用nvm来管理node.js的不同版本。 此处仅总结卸载当前版本node.js重新安装所需版本node.js的方法 另&#xff1a;现在 用Vite官网里面的 yarn/npm等 的方法&#xff0c;创建Vue3项目——需要12版本的node.js 以下以本人 …

Vue3中readonly 与 shallowReadonly的使用区别?

文章目录前言readonly强行修改readonly&#xff1a;shallowReadonlyshallowReadonly强行修改结果&#xff1a;前言 readonly: 让一个响应式数据变为只读的&#xff08;深只读&#xff09;。 shallowReadonly&#xff1a; 让一个响应式数据变为只读的&#xff08;浅只读&#x…

真正好用的工业品ERP系统应该是什么样的?

一个好用的进销存ERP系统应该有以下特点&#xff1a; 1. 全面覆盖企业经营流程&#xff0c;包括采购、销售、库存、财务等模块&#xff0c;能够实现全方位的管理和控制。 2. 自定义配置&#xff0c;灵活地适应大多数用户的需求。 3. 数据精准、实时化&#xff0c;支持统计分…

基于CALMET诊断模型的高时空分辨率精细化风场模拟技术应用

【查看原文】气象数据相关分析及使用系列&#xff1a;基于CALMET诊断模型的高时空分辨率精细化风场模拟技术应用 在研究流场时&#xff0c;常用观测、模型风洞测试和数值模拟方法进行研究。但时常遇到研究区气象站点分布稀疏&#xff0c;不能代表周边复杂地形的风场。风洞模拟…

day7 线程的取消和清理

线程的取消 意义&#xff1a;随时杀掉一个线程 int pthread_cancel(pthread_t thread); 注意&#xff1a;线程的取消要有取消点才可以&#xff0c;不是说取消就取消&#xff0c;线程的取消点主要是阻塞的系统调用 如果没有取消点&#xff0c;手动设置一个&#xff1b; voi…

【网络应用开发】实验4——会话管理

目录 会话管理预习报告 一、实验目的 二、实验原理 三、实验预习内容 1. 什么是会话&#xff0c;一个会话的生产周期从什么时候&#xff0c;到什么时候结束&#xff1f; 2. 服务器是如何识别管理属于某一个特定客户的会话的&#xff1f; 3. 什么是Cookie&#xff0c;它的…

全网最详细,Python接口自动化测试接口加密实战,框架撸码.......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 如果接口测试仅仅只…

【驱动开发】Windows过滤平台(WFP,Windows Filtering Platform)

文章目录Windows的发展历程TDI简介WFP简介用户态基础过滤引擎&#xff08;BFE&#xff09;内核态过滤引擎&#xff08;KMFE&#xff09;垫片&#xff08;Shim&#xff09;分层&#xff08;Layer&#xff09;子层&#xff08;Sub Layer&#xff09;过滤器&#xff08;Filter&…

【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)

可在系列教程的基础上继续开发&#xff0c;也可以单独使用 【微信小程序-原生开发】系列教程 效果预览 代码实现 点击触发生成海报 在活动详情页&#xff0c;指定点击某图标/按钮&#xff0c;触发跳转到生成海报的页面 pages\components\party\detail\index.js getPoster() …

OpenTex 企业内容管理平台

OpenText 企业内容管理平台 将内容服务与领先应用程序集成&#xff0c;弥合内容孤岛、加快信息流并扩大治理 什么是内容服务集成&#xff1f; 内容服务集成通过将内容管理平台与处于流程核心的独立应用程序和系统连接起来&#xff0c;支持并扩展了 ECM 的传统优势。 最好的内…

【通过Cpython3.9源码看看python字符串对象的创建】

CPython源码解析之PyUnicode_New函数实现 简介 PyUnicode_New是Python源码中用于创建Unicode字符串对象的函数&#xff0c;定义在UnicodeObject.c文件中。该函数接受一个长度参数size和最大字符值参数maxchar(根据传入的最大字符值 maxchar 确定新创建的字符串对象所需的存储…

百度工程师的软件质量与测试随笔

作者 | 百度移动生态质效工程师们 导读 在降本增效、以chatGPT为代表的大模型技术横空出世的背景下&#xff0c;对软件质量和软件测试的领域也带来了巨大冲击&#xff0c;也使得软件质量工作者开始变得焦虑&#xff0c;主要体现在&#xff1a;公司对软件质量从业者的不重视加剧…

SQL Server的执行计划(Execution Plans)

执行计划一、背景二、显示和保存执行计划三、显示估计的执行计划四、显示实际执行计划五、以 XML 格式保存执行计划六、比较和分析执行计划6.1、比较执行计划6.2、分析实际执行计划总结一、背景 为了能够执行查询&#xff0c;SQL Server 数据库引擎必须分析该语句&#xff0c;…

21100颗星的Locust性能测试工具到底有多牛!

一句话&#xff1a;用普通的Python编写可扩展的负载测试&#xff0c;就够了&#xff0c;懂得自然懂&#xff01; Locust是一个易于使用、可编写脚本和可扩展的性能测试工具。你在常规的Python代码中定义你的用户的行为&#xff0c;而不是受制于一个UI或领域特定的语言&#xff…

HTB-Obscurity

HTB-Obscurity信息收集8080端口立足www-data -> robertrobert -> rootsudo 注入hash捕获信息收集 8080端口 ”如果攻击者不知道你在使用什么软件&#xff0c;你就不会被黑客攻击!“&#xff0c;目标对web的指纹做了某些处理。 “‘SuperSecureServer.py’ in the secre…

【从零开始学Skynet】基础篇(六):MySql数据库安装操作

游戏服务端的另一项重要功能是保存玩家数据&#xff0c;Skynet提供了操作MySQL数据库、MongoDB数据库的模块。1、数据库安装 首先安装Mysql服务器&#xff0c;打开终端输入如下指令&#xff1a; sudo apt-get install mysql-server 按下回车&#xff0c;输入密码后开始安装&a…

秒杀架构(二) -- nginx实现限流

限流&#xff08;Rate Limitting&#xff09;是服务降级的一种方式&#xff0c;通过限制系统的输入和输出流量以达到保护系统的目的。比如我们的网站暴露在公网环境中&#xff0c;除了用户的正常访问&#xff0c;网络爬虫、恶意攻击或者大促等突发流量都可能都会对系统造成压力…

OpenCV按指定大小分割图像并保存详细讲解

这几天在忙着整理自己的数据集&#xff0c;使用工业级相机拍了好多高清照片&#xff0c;但是模型训练的时候需要使用512*512像素点大小的图像&#xff0c;而且我的模型设计的时候就已经规定好了训练样本大小。 那就分割呗&#xff0c;把拍的照片按512*512分割一小块一小块的&am…

easyx

普通的画线图什么的 首先我们需要安装一个easyx的图形库&#xff0c;然后把头文件搞出来 #include <stdio.h> #include <easyx.h>//easyx画线啥啥的图形库 #include <graphics.h> #include <math.h> #include <conio.h>//键盘操作的头文件 设…

2023年mathorcupD题航空安全风险分析和飞行技术评估思路分析

2023年mathorcupD题航空安全风险分析和飞行技术评估思路分析 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快 速发展&#xff0c;针对飞行安全问题的研究显得越来越重要。2022 年 3 月 21 日&#xff0c;“3.21” 空难的发生终结了中国民航安全飞行 1 亿零 59…