【React系列二】—React学习历程的分享

news/2024/10/29 0:45:52/

一、表单处理

受控组件

  • HTML 中的表单元素是可输入的,也就是有自己的可变状态

  • 而 React 中可变状态通常保存在state中,并且只能通过 setState() 方法来修改

  • React 将 state 与表单元素值 value 绑定在一起,有 state 的值来控制表单元素的值

  • 受控组件就是值受到react控制的表单元素

javascript">// 受控组件
class Login extends React.Component {state = {username: '',password: '',}saveUsername = (event) => {this.setState({ username: event.target.value })}savePassword = (event) => {this.setState({ password: event.target.value })}handleSubmit = (event) => {event.preventDefault()const { username, password } = this.statealert(`用户名是:${username}, 密码是:${password}`)}render() {return (<form onSubmit={this.handleSubmit}>用户名:<input onChange={this.saveUsername} type="text" name="username" />密码:<input onChange={this.savePassword} type="password" name="password" /><button>登录</button></form>)}
}

非受控组件

  • 说明:借助于 ref,使用原生 DOM 方式获取表单元素值

  • ref 的作用:获取 DOM 或者组件

javascript">// 非受控组件
class Login extends React.Component {handleSubmit = (event) => {event.preventDefault()const { username, password } = thisalert(`用户名是:${username.value}, 密码是:${password.value}`)}render() {return (<form onSubmit={this.handleSubmit}>用户名:<input ref={(c) => (this.username = c)} type="text" name="username" />密码:<input ref={(c) => (this.password = c)} type="password" name="password" /><button>登录</button></form>)}
}

总结

  • 组件的两种创建方式:函数组件和类组件

  • 无状态(函数)组件,负责静态结构展示

  • 有状态(类)组件,负责更新 UI,让页面动起来

  • 绑定事件注意 this 指向

  • 推荐使用受控组件来处理表单

  • 完全利用 JS 语言的能力创建组件,这是 React 的思想

二、组件实例核心—state

state 是组件实例对象最重要的属性,值为对象。又称为状态机,通过更新组件的 state 来更新对应的页面显示。

知识要点:

  • 初始化 state
  • React 中事件绑定
  • this 指向问题
  • setState 修改 state 状态
  • constructor 、render 、自定义方法的调用次数
javascript"><script type="text/babel">class Weather extends React.Component {// 调用一次constructor(props) {super(props)// 初始化 statethis.state = { isHot: true, wind: '微风' }// 解决 this 指向问题this.changeWeather = this.changeWeather.bind(this)}// 调用 1+N 次render() {// 读取状态const { isHot } = this.statereturn <h1 onClick={this.changeWeather}>今天天气 {isHot ? '炎热' : '凉爽'}</h1>}// 点一次调一次changeWeather() {const isHot = this.state.isHot// 对 state 的修改是一种合并而非替换,即 wind 依然存在this.setState({ isHot: !isHot })}}ReactDOM.render(<Weather />, document.getElementById('test'))
</script>

三、组件实例核心—props

每个组件对象都有 props 属性,组件标签的属性都保存在 props 中。

props 是只读的,不能修改。

可以给组件传递任意类型的props数据

基本使用

javascript"><script type="text/babel">class Person extends React.Component {render() {const { name, age, sex } = this.propsreturn (<ul><li>姓名:{name}</li><li>性别:{sex}</li><li>年龄:{age}</li></ul>)}}// 类似于标签属性传值ReactDOM.render(<Person name="Lily" age={19} sex="男" />, document.getElementById('test'))
</script>

批量传递

javascript"><script type="text/babel">class Person extends React.Component {render() {const { name, age, sex } = this.propsreturn (<ul><li>姓名:{name}</li><li>性别:{sex}</li><li>年龄:{age}</li></ul>)}}const obj = { name: 'Ben', age: 21, sex: '女' }ReactDOM.render(<Person {...obj} />, document.getElementById('test'))
</script>

限制props传递类型

在React15.5版本之前,React身上有一个propTypes属性可以直接使用,在15.5版本之后,把propTypes单独封装成一个模块,需要额外导入使用

javascript"><!-- 引入prop-types,用于对组件标签属性进行限制 -->
<script type="text/javascript" src="../js/prop-types.js"></script><script type="text/babel">class Person extends React.Component {render() {const { name, age, sex } = this.propsreturn (<ul><li>姓名:{name}</li><li>性别:{sex}</li><li>年龄:{age}</li></ul>)}}// 类型和必要性限制Person.propTypes = {name: PropTypes.string.isRequired,sex: PropTypes.string,age: PropTypes.number,// 限制 speak 为函数speak: PropTypes.func,}// 指定默认值Person.defaultProps = {sex: 'male',age: 19,}ReactDOM.render(<Person name="Vue" sex="male" age={11} speak={speak} />, document.getElementById('test'))function speak() {console.log('speaking...')}
</script>

类组件的构造器使用props

构造函数一般用在两种情况:

  • 通过给 this.state 赋值对象来初始化内部 state
  • 为事件处理函数绑定实例
javascript">constructor(props) {super(props)// 初始化 statethis.state = { isHot: true, wind: '微风' }// 解决 this 指向问题this.changeWeather = this.changeWeather.bind(this)
}

函数组件使用props

javascript"><!-- 引入prop-types,用于对组件标签属性进行限制 -->
<script type="text/javascript" src="../js/prop-types.js"></script><script type="text/babel">function Person(props) {const { name, age, sex } = propsreturn (<ul><li>姓名:{name}</li><li>性别:{sex}</li><li>年龄:{age}</li></ul>)}Person.propTypes = {name: PropTypes.string.isRequired,sex: PropTypes.string,age: PropTypes.number,}Person.defaultProps = {sex: '男',age: 18,}ReactDOM.render(<Person name="jerry" />, document.getElementById('test'))
</script>

有不明白的或者有其他问题的可以评论区留言噢

今天的知识分享就到这里啦~希望大家在这能学到知识一起分享一起进步,成为更好的自己!


http://www.ppmy.cn/news/1542731.html

相关文章

短信验证码发送实现(详细教程)

短信验证码 接口防刷强检验以及缓存验证码阿里云短信服务操作步骤验证码发送实现 好久没发文啦&#xff01;最近也是在工作中遇到我自认为需要记录笔记的需求&#xff0c;本人只求日后回顾有迹可寻&#xff0c;不喜勿喷&#xff01; 废话不多说&#xff0c;直接上代码&#xff…

Linux定时器定时任务清理log日志文件

首先&#xff0c;创建xx.sh文件&#xff0c;内容如下 #!/bin/bash sfecho "" > /var/lib/docker/containers/12379e809ea1294eea9b117368181cff1dd3915fdb1611f940c5cf3d6077d734/12379e809ea1294eea9b117368181cff1dd3915fdb1611f940c5cf3d6077d734-json.log 打…

数字IC后端实现Innovus |给各种IP子模块添加port buffer和antenna diode万能脚本

我们之前分享过在hierarchical flow后端实现中为了确保顶层flatten时timing signoff和physical signoff看到的情况和模块级看到的情况一致&#xff0c;我们会在模块io port添加io port buffer&#xff08;主要是timing&#xff0c;antenna一致性&#xff09;。实际上在芯片级我…

04C++循环结构

//while 循环#include <iostream> using namespace std; int main() { int num0; while (num<10){ cout<<num<<endl; num; } return 0; } //do while语句 #include <iostream> using namespace std; int mai…

【vue】Mammoth.js的使用:将.docx和doc 文件转换成HTML

mammoth.convertToHtml(input, options&#xff09; &#xff1a;把源文档转换为 HTML 文档 mammoth.convertToMarkdown(input, options) &#xff1a;把源文档转换为 Markdown 文档。 mammoth.extractRawText(input) &#xff1a;提取文档的原始文本。这将忽略文档中的所有格式…

格姗知识圈博客网站开源了!

格姗知识圈博客 一个基于 Spring Boot、Spring Security、Vue3、Element Plus 的前后端分离的博客网站&#xff01;本项目基本上是小格子一个人开发&#xff0c;由于工作和个人能力原因&#xff0c;部分技术都是边学习边开发&#xff0c;特别是前端&#xff08;工作中是后端开…

部署DNS主从服务器

一。DNS主从服务器作用&#xff1a; DNS作为重要的互联网基础设施服务&#xff0c;保证DNS域名解析服务的正常运转至关重要&#xff0c;只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中&#xff0c;从服务器可以从主服务器上获取指定的区域数据文件&…

自定义鼠标事件在拖拽中的使用

目标&#xff1a; 显示鼠标在容器元素中划过时经过的元素,但是容器内肯能会出现大量元素&#xff0c;所以直接给容器元素添加click事件&#xff0c;通过elementFromPoint的API模拟子元素被点击事件效果 看看效果吧 涉及的重要对象 MousEvent 参考 MDN 相关代码 operateCont…