【React】React入门--更改状态、属性、表单的非受控组件和受控组件

简介: 更改状态、属性、表单的非受控组件和受控组件

🎀个人主页:努力学习前端知识的小羊

感谢你们的支持:收藏🎄 点赞🍬 加关注🪐


setState

this.state是纯js对象,在vue中,data属性是利用object.defineProperty处理过的,更改data数据的时候会触发数据的getter和setter,但是React没有做这样的处理,所以不能直接更改this.state中的值,需要使用特殊的更改状态的方法setState

以下方代码为例,对button按钮绑定onClick事件,点击按钮,改变this.state中的myshow值和myname值,从而判断是收藏还是取消收藏

export default class App extends Component {
    constructor(){
        super()
        this.state = {
            mytext:"收藏",
            myshow:true,
            myname:"kerwin"
        }
    }
  render() {
    return (
      <div>
        <h1>欢迎来到React开发-{this.state.myname}</h1>
        <button onClick={()=>{
            this.setState({
                myshow:!this.state.myshow,
                myname:"xiaoming"
            }) //间接修改收藏
            if(this.state.myshow){
                console.log("收藏的逻辑");
            } else{
                console.log("取消收藏的逻辑");
            }
        }}>{this.state.myshow?"收藏":"取消收藏"}</button>
      </div>
    )
  }
}

setState有两个参数

第一个参数可以是对象,也可以是方法return一个对象

  • 参数是对象
this.setState({
                myshow:!this.state.myshow,
                myname:"xiaoming"
            }) 
  • 参数是方法
this.setState((prevState,props)=>{
  return {
  myshow:!prevState.myshow,
    }
})

该方法中接受了两个参数,一个是上一次的state,一个是pops

属性(props)

props是外部传入的数值,组件内部也可以通过一些方式进行初始化的设置,属性不能被组件自己更改,但是可以通过父组件组东重新渲染的方式来传入新的props

props的使用:在使用一个组件的时候,可以把参数放在标签的属性当中,这些属性都会作为组件props对象的键值

  • 在组件上通过key=value写属性,通过this.props获取属性
  • 在传参时候,如果写成isshow = "true"那么传过去的数值是一个字符串,如果写成isshow = {true}这时传过去的是布尔值
  • {…对象}利用ES6展开赋值
  • 默认属性值
// 默认属性
    static defaultProps={
        leftshow:true  //如果组件中没有传leftshow的键值,则默认leftshow值为true
    }
  • 属性验证prop-types


import kerwinPropTypes from 'prop-types'
    //   类属性
    static propTypes ={
        title:kerwinPropTypes.string,  //验证数值是否为字符串
        leftshow:kerwinPropTypes.bool  // 验证数值是否为布尔值
    }

属性vs状态

相似点:都是纯js对象,都会触发render更新,都具有确定性(状态/属性相同,结果相同)

不同点:

  • 属性能从父组件获取,状态不能
  • 属性可以由父组件修改,状态不能
  • 属性能在内部设置默认值,状态也可以,设置方式不一样
  • 属性不在组件内部修改,状态要在组件内部修改
  • 属性能设置子组件初始值,状态不可以
  • 属性可以修改子组件的值,状态不可以

state的主要作用是用于组件保存、控制、修改自己的可变状态。state在组件内部初始化,可以被组件自身修改,而外部不能访问也不能修改。state中状态可以通过this.setstate方法进行更新,setstate会导致组件的重新渲染。

props的主要作用是让使用该组件的父组件可以传入参数来配置该组件。它是外部传进来的配置参数,组件内部无法控制也无法修改。除非外部组件主动传入新的props,否则组件的 props永远保持不变。

非受控组件

React要编写一个非受控组件,可以使用ref来从Dom节点中获取表单数据,即为非受控组件

import React, { Component } from 'react'
export default class App extends Component {
    myusername = React.createRef()
  render() {
    return (
      <div>
            <h1>登录页</h1>
            <input type="text" ref = {this.myusername} value="lll"/>
            <button onClick={()=>{
                console.log(this.myusername.current.value);
            }}>登录</button>
            <button onClick={()=>{
                this.myusername.current.value = ""
            }}>重置</button>
      </div>
    )
  }
}

在该非受控组件中,input表单中的值无法改变,永远都是‘lll’,因为非受控组件将真实的数据储存在Dom节点中

受控组件

通过state状态来改变表单中的值,对于受控组件来说,输入的值始终由React的state驱动

import React, { Component } from 'react'
export default class App extends Component {
    state={
        myusername:"kerwin"
    }
    render() {
        return (
          <div>
                <h1>登录页</h1>
                <input type="text" value={this.state.myusername}
                 onChange={(evt)=>{
                                 console.log("onchange",evt.target.value);
                     this.setState({
                         myusername:evt.target.value
                     })
                }}/>
                <button onClick={()=>{
                    console.log(this.state.myusername);
                }}>登录</button>
                <button onClick={()=>{
                    this.setState({
                        myusername:""
                    })
                }}>重置</button>
          </div>
        )
      }
}

表单中的value值为state.myusername值,因此每次触发onChange绑定的事件改变state.myusername值,则表单中的value也随之改变,因此input表单中的值随着用户的输入而更新

希望对大家有所帮助,期待你们的支持✨✨✨



目录
相关文章
|
3月前
|
移动开发 前端开发 JavaScript
React 表单与事件
10月更文挑战第10天
54 1
|
3月前
|
前端开发 JavaScript 数据安全/隐私保护
深入探索研究React表单
【10月更文挑战第6天】
93 57
|
1月前
|
存储 前端开发 JavaScript
React 表单输入组件 Input:常见问题、易错点及解决方案
本文介绍了在 React 中使用表单输入组件 `Input` 的基础概念,包括受控组件与非受控组件的区别及其优势。通过具体代码案例,详细探讨了创建受控组件、处理多个输入字段、输入验证和格式化的方法,并指出了常见易错点及避免方法,旨在提升表单的健壮性和用户体验。
52 4
|
2月前
|
前端开发 JavaScript 定位技术
React 地图组件 Mapbox 入门指南
Mapbox 是一个强大的地图平台,提供丰富的地图数据和工具,支持多种开发语言和框架。本文介绍如何在 React 项目中使用 Mapbox,涵盖基础概念、安装配置、基本用法、常见问题及解决方法、高级用法等内容,并通过代码示例详细说明,帮助开发者提升地图应用的开发效率和用户体验。
146 2
|
2月前
|
前端开发 API UED
React 图片轮播 Carousel:从入门到进阶
本文介绍了在 React 中实现图片轮播(Carousel)的方法,从基础安装和配置 `react-slick` 开始,逐步讲解了常见问题如图片路径、性能优化、自定义样式和交互处理,以及高级话题如动态数据加载和响应式设计。通过详细示例,帮助开发者避免易错点,提升轮播图的用户体验。
65 3
|
2月前
|
前端开发 JavaScript
React 表单处理技巧
【10月更文挑战第24天】本文从初学者角度出发,详细介绍了 React 中表单处理的基本概念、常见问题及解决方案。涵盖受控组件与非受控组件的区别、状态更新、表单验证、多字段管理及高级技巧,通过代码示例帮助读者更好地理解和应用。
100 7
|
2月前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
129 10
|
3月前
|
前端开发 JavaScript 开发者
探索现代Web前端技术:React框架入门
【10月更文挑战第9天】 探索现代Web前端技术:React框架入门
|
2月前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
99 9
|
3月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。