React 之受控组件和非受控组件

简介:

在React中,所谓受控组件和非受控组件,是针对表单而言的。

表单受控组件

  • 表单元素依赖于状态,表单元素需要默认值实时映射到状态的时候,就是受控组件,这个和双向绑定相似.
  • 受控组件,表单元素的修改会实时映射到状态值上,此时就可以对输入的内容进行校验.
  • 受控组件只有继承React.Component才会有状态.
  • 受控组件必须要在表单上使用onChange事件来绑定对应的事件.
class Control extends React.Component {
    // 这样的写法也是声明在实例上的对象
    state = {// 给组件状态设置默认值,在实时修改时进行校验
        username: "zf",
        pwd: "123"
    }

    // e为原生的事件绑定对象
    handleChange = (e) => {
        // 获取原生对象上的属性
        let name = e.target.name;
        // 根据表单元素的name名称进行匹配,比如用户名的name是username,那新输入的值将更新原来的值
        this.setState({
            [name]: e.target.value
        })
    }

    render() {
        return (
            <div>
                <p>{this.state.username}</p>
                用户名:<input
                    name="username"
                    type="text"
                    value={this.state.username}
                    onChange={this.handleChange} /> <br />

                <p>{this.state.pwd}</p>
                密码:<input
                    name="pwd"
                    type="text"
                    value={this.state.pwd}
                    onChange={this.handleChange} /> <br />
            </div>
        )
    }
}

复制代码

受控组件显示结果

怎么样,这个效果是不是和双向绑定很相似?

注意:

  • 在受控组件中,如果没有给输入框绑定onChange事件,将会收到react的警告
  • 并且此时输入框除了默认值,是无法输入其他任何参数的
class Control extends React.Component {
    constructor() {
        super();
        this.state = {
            username: "zds",
            age: 10
        }
    }
    render() {
        return (
            <div>
                username:<input
                    type="text"
                    name="username"
                    value={this.state.username} /><br />
                age:<input
                    type="text"
                    name="age"
                    value={this.state.age} />
            </div>
        )
    }
}
复制代码

结果可以从如下图中看出:

  • 输入框没有绑定onChange事件无法修改输入框中的值
  • 会触发react警告

非受控组件

  • 非受控组件即不受状态的控制,获取数据就是相当于操作DOM。
  • 非受控组件的好处是很容易和第三方组件结合。

获取输入框中的值的两种方法

  • ref 功能是一样,只是写法不一样,可以让我们操作DOM

第一种方式是函数

  • 在虚拟DOM节点上使用ref,并使用函数,将函数的参数挂载到实例的属性上
handleSubmit = (e) => {
    // 阻止原生默认事件的触发
    e.preventDefault();
    console.log(this.username.value);
}
render() {
    return (
        <form onSubmit={this.handleSubmit}>
            {/* 将真实的DOM,username是输入框中输入的值赋值给组件实例上
                这样,在页面表单提交的时候就可以通过this.username.value获取到输入框输入的值
            */}
            用户名<input
                name="username"
                type="text"
                ref={username=>this.username=username}
            /><br />
        </form>
    )
}
复制代码

现在我们来看看第一种非受控方式是如何获取输入框中的值的:

第二种方式:通过构造函数声明的方式

  • react 16.3新语法
  • 实例的构造函数constructor这创建一个引用
  • 在虚拟DOM节点上声明一个ref属性,并且将创建好的引用赋值给这个ref属性
  • react会自动将输入框中输入的值放在实例的second属性上
constructor(){
    super();
    // 在构造函数中创建一个引用
    this.second=React.createRef();
}
handleSubmit = (e) => {
    // 阻止原生默认事件的触发
    e.preventDefault();
    console.log(this.second.current.value);
}
render() {
    return (
        <form onSubmit={this.handleSubmit}>
            {/* 自动将输入框中输入的值放在实例的second属性上 */}
            密码<input
                name="password"
                type="text"
                ref={this.second}
            /><br />
        </form>
    )
}
复制代码

现在我们来看看第二种非受控方式是如何获取输入框中的值的:

好了,react关于表单的受控组件和非受控组件就先整理到这里,有问题的话,欢迎大家留言沟通!


作者:tenor
原文发布时间:2018年06月29日
本文来源 掘金如需转载请紧急联系作者
相关文章
|
12天前
|
前端开发 JavaScript 测试技术
React 分页组件 Pagination
本文介绍了如何在 React 中从零构建分页组件,涵盖基础概念、常见问题及解决方案。通过示例代码详细讲解了分页按钮的创建、分页按钮过多、初始加载慢、状态管理混乱等常见问题的解决方法,以及如何避免边界条件、性能优化和用户反馈等方面的易错点。旨在帮助开发者更好地理解和掌握 React 分页组件的开发技巧,提升应用的性能和用户体验。
43 0
|
1月前
|
前端开发 开发者
React 函数组件与类组件对比
【10月更文挑战第4天】本文详细比较了React中的函数组件与类组件。函数组件是一种简单的组件形式,以纯函数的形式返回JSX,易于理解与维护,适用于简单的UI逻辑。类组件则是基于ES6类实现的,需要重写`render`方法并能利用更多生命周期方法进行状态管理。文章通过示例代码展示了两者在状态管理与生命周期管理上的差异,并讨论了常见的问题如状态更新异步性与生命周期管理的复杂性,最后给出了相应的解决方法。通过学习,开发者可以根据具体需求选择合适的组件类型。
57 8
|
2月前
|
前端开发 JavaScript 网络架构
react对antd中Select组件二次封装
本文介绍了如何在React中对Ant Design(antd)的Select组件进行二次封装,包括创建MSelect组件、定义默认属性、渲染Select组件,并展示了如何使用Less进行样式定义和如何在项目中使用封装后的Select组件。
100 2
react对antd中Select组件二次封装
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
176 2
|
17天前
|
移动开发 前端开发 API
React 拖拽组件 Drag & Drop
本文介绍了在 React 中实现拖拽功能的方法,包括使用原生 HTML5 Drag and Drop API 和第三方库 `react-dnd`。通过代码示例详细讲解了基本的拖拽实现、常见问题及易错点,帮助开发者更好地理解和应用拖拽功能。
47 9
|
12天前
|
前端开发 UED 开发者
React 分页组件 Pagination
本文介绍了如何在 React 中实现分页组件,从基础概念到常见问题及解决方案。分页组件用于将大量数据分成多个页面,提升用户体验。文章详细讲解了分页组件的基本结构、快速入门步骤、以及如何处理页面跳转不平滑、页码过多导致布局混乱、边界条件处理和数据加载延迟等问题。通过本文,读者可以全面了解并掌握 React 分页组件的开发技巧。
17 2
|
15天前
|
设计模式 前端开发 编译器
与普通组件相比,React 泛型组件有哪些优势?
与普通组件相比,React 泛型组件有哪些优势?
32 6
|
24天前
|
前端开发 JavaScript 安全
学习如何为 React 组件编写测试:
学习如何为 React 组件编写测试:
36 2
|
1月前
|
前端开发 JavaScript 测试技术
React 高阶组件 (HOC) 应用
【10月更文挑战第16天】高阶组件(HOC)是 React 中一种复用组件逻辑的方式,通过接受一个组件并返回新组件来实现。本文介绍了 HOC 的基础概念、核心功能和常见问题,包括静态方法丢失、ref 丢失、多个 HOC 组合和 props 冲突的解决方案,并提供了具体的 React 代码示例。通过本文,读者可以更好地理解和应用 HOC,提高代码的复用性和可维护性。
60 8
|
30天前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。