位置: IT常识 - 正文

React 面向组件编程(上)(react组件定义)

编辑:rootadmin
React 面向组件编程(上) 目录前言:一、组件的基本理解和使用1. 函数式组件2. 类式组件3. 注意事项4. 渲染函数式组件标签的基本流程5. 渲染类组件标签的基本流程二、组件三大核心属性 1:state1. 代码示例2. 效果展示3. 注意4. 设置状态:setState三、 组件三大核心属性 2:props1. 函数式组件代码示例2. 类式组件代码示例3. 效果展示4. props 属性的特点:5. 对 props 进行限制四、组件三大核心属性 3:refs与事件处理1. 字符串形式的代码示例2. 回调函数形式的代码示例3. createRef 代码示例4. 效果展示5. refs 使用场景总结:前言:

推荐整理分享React 面向组件编程(上)(react组件定义),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:react组件constructor,react组件开发规范,react组件调用方法,react组件调用方法,react组件开发规范,react组件constructor,react组件constructor,react面向对象,内容如对您有帮助,希望把文章链接给更多的朋友!

在React中,组件实例的三大核心属性包含state、props、ref,通过这三大核心属性的使用,我们能够实现对组件的状态进行更新。

一、组件的基本理解和使用1. 函数式组件function MyComponent(){ return <h2>我是用函数定义的组件(适用于【简单组件】的定义)</h2>}ReactDOM.render(<MyComponent />,document.getElementById('test'))2. 类式组件class MyComponent extends React.Component{ render(){ return <h2>我是用类定义的组件(适用于【复杂组件】的定义)</h2> }}ReactDOM.render(<MyComponent />,document.getElementById('test'))3. 注意事项组件名必须首字母大写虚拟DOM元素只能有一个根元素虚拟DOM元素必须有结束标签4. 渲染函数式组件标签的基本流程React 解析了组件标签,找到对应的组件发现这个组件是一个函数定义的,随后调用该函数,生成了一个虚拟DOM最后将虚拟DOM转化为真实DOM,呈现在页面中;5. 渲染类组件标签的基本流程React 解析了组件标签,找到对应的组件发现这个组件是一个类定义的,随后new出来一个实例对象,并通过该实例调用原型上的render方法将render()返回的内容生成了一个虚拟DOM最后将虚拟DOM转化为真实DOM,呈现在页面中;二、组件三大核心属性 1:state

React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。 React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。

1. 代码示例<script type="text/babel"> // 1. 创建一个类式组件 class Weather extends React.Component{ // 构造器调用了几次? --- 实例化了几次,调用几次 --- 1次 constructor(){ super(); // console.log(this) this.state = {isHot:false,wind:"微风"} this.changeWeather = this.changeWeather.bind(this) } // render方法是放在原型上的 // render中的this是谁? -- 实例对象 <===> Weather组件实例对象 // render方法调用了几次? --- 1 + N // 调用的流程: // 1. 页面状态发生改变时,重新调用render方法来生成一个新的虚拟DOM // 2. 通过diff算法来 对比 新旧虚拟DOM之间的差别,从而进行合并 // 3. 将对比合并过后的虚拟DOM 转换为真实DOM,挂载到页面的指定位置 render(){ // console.log('render中的this',this) // onClick事件:首字母需要大写,由于changeWeather是作为onClick的事件回调,所以这里需要一个函数体,而不是函数执行后的结果 let {isHot,wind} = this.state return <h2 onClick={this.changeWeather}>今天的天气很 {isHot? '炎热' : '凉爽' },{wind}</h2> // isHot } // changeWeather调用几次? --- 点几次调用几次 changeWeather(){ // 因为Babel编译,所以导致类中的方法默认开启局部的严格模式,所以这里的this是undefined // console.log('changeWeather',this.state) // 严重注意:状态(state)不可直接修改 // this.state.isHot = !this.state.isHot // 这里是一种错误写法 let {isHot} = this.state this.setState({ isHot:!isHot }) // 这里的修改是一种合并,对比属性的变化,如果有赋新值,如果没有跳过; } } // 2. 渲染到页面中的指定 DOM // ReactDOM.render(虚拟DOM,真实DOM) ReactDOM.render(<Weather />,document.getElementById('test'))</script>2. 效果展示

3. 注意组件中render方法中的this为组件实例对象组件自定义的方法中this为undefined,如何解决?强制绑定this: 通过函数对象的bind()箭头函数状态数据,不能直接修改或更新4. 设置状态:setState

setState(object nextState[, function callback])

不能在组件内部通过 this.state 修改状态,因为该状态会在调用 setState() 后被替换。

setState() 并不会立即改变 this.state,而是创建一个即将处理的 state。setState() 并不一定是同步的,为了提升性能 React 会批量执行 state 和 DOM 渲染。

setState() 总是会触发一次组件重绘,除非在 shouldComponentUpdate() 中实现了一些条件渲染逻辑。

三、 组件三大核心属性 2:propsReact 面向组件编程(上)(react组件定义)

react 中说的单向数据流值说的就是 props,根据这一特点它还有一个作用:组件之间的通信。props 本身是不可变的,但是有一种情形它貌似可变,即是将父组件的 state 作为子组件的 props,当父组件的 state 改变,子组件的 props 也跟着改变,其实它仍旧遵循了这一定律:props 是不可更改的。

1. 函数式组件代码示例<script type="text/babel"> function Person (props) { let {name,age,sex} = props return( <ul> <li>姓名:{name}</li> <li>性别:{sex}</li> <li>年龄:{age+1}</li> </ul> ) } // 给指定的属性,添加默认值 Person.defaultProps = { sex:'男' } // 1. 数据类型,是否应该有对应的限制? // 2. 数据的数量,批量性传输的时候,可以使用展开运算符 // let speak = 'speak' ReactDOM.render(<Person name="tom" age="18" sex="男"/>,document.getElementById('test1')) ReactDOM.render(<Person name="jock" age="19" sex="女"/>,document.getElementById('test2')) const p = {name:'老王',age:22} ReactDOM.render(<Person {...p}/>,document.getElementById('test3'))</script>2. 类式组件代码示例<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Props基本使用</title></head><body> <!-- 准备好一个容器 --> <div id="test1"></div> <div id="test2"></div> <div id="test3"></div> <!-- 引入 React 核心库 --> <script src="../js/react.development.js"></script> <!-- 引入 react-dom 用于支持 react 操作 DOM --> <script src="../js/react-dom.development.js"></script> <!-- 引入babel:1. ES6 ==> ES52. jsx ==> js--> <script src="../js/babel.min.js"></script> <script type="text/babel"> class Person extends React.Component{ render(){ let {name,age,sex} = this.props console.log(this) return( <ul> <li>姓名:{name}</li> <li>性别:{sex}</li> <li>年龄:{age+1}</li> </ul> ) } } // 1. 数据类型,是否应该有对应的限制? // 2. 数据的数量,批量性传输的时候,可以使用展开运算符 ReactDOM.render(<Person name="tom" age="18" sex="男"/>,document.getElementById('test1')) ReactDOM.render(<Person name="jock" age="19" sex="女"/>,document.getElementById('test2')) const p = {name:'老王',age:22,sex:'男'} // console.log("@",{...p}) ReactDOM.render(<Person {...p}/>,document.getElementById('test3')) </script></body></html>3. 效果展示

需求: 自定义用来显示一个人员信息的组件

姓名必须指定,且为字符串类型;性别为字符串类型,如果性别没有指定,默认为男年龄为字符串类型,且为数字类型,默认值为18

4. props 属性的特点:每个组件对象都会有props(properties的简写)属性组件标签的所有属性都保存在props中内部读取某个属性值:this.props.propertyName作用:通过标签属性从组件外 向组件内传递数据(只读 read only)对props中的属性值进行类型限制和必要性限制5. 对 props 进行限制引入 prop-type 库,这就是专门用于限制 props 属性的一个库导入 prop-type 库,到当前页面根据 Person.propTypes = {} 进行限制

参考官方文档所示

// cli 脚手架引入方式import PropTypes from "prop-types";// js 引入方式<script src="https://unpkg.com/prop-types@15.6/prop-types.js"></script>// 类式组件class index extends Component { static propTypes = { // 限制 list,为数组类型,必填 list: PropTypes.array.isRequired, // 限制 changeitem,为一个函数,必填 changeitem: PropTypes.func.isRequired, // 限制 onDelete,为一个函数,必填 onDelete: PropTypes.func.isRequired, } render() { const { list, changeitem, onDelete } = this.props return ( <ul className="todo-main"> <Item list={list} changeitem={changeitem} onDelete={onDelete} /> </ul> ); }}注意:

在 React v15.5 中PropTypes是react的内置对象,在 React v15.5 开始已弃用以下方式。

Person.propTypes = {name: React.PropTypes.string.isRequired,age: React.PropTypes.number}四、组件三大核心属性 3:refs与事件处理

Refs 是一个 获取 DOM节点或 React元素实例的工具。在 React 中 Refs 提供了一种方式,允许用户访问DOM 节点或者在render方法中创建的React元素。 在 React单项数据流中,props是父子组件交互的唯一方式。要修改一个子组件,需要通过的新的props来重新渲染。 但是在某些情况下,需要在数据流之外强制修改子组件。被修改的子组件可能是一个React组件实例,也可能是一个DOM元素。对于这两种情况,React 都通过 Refs的使用提供了具体的解决方案。

1. 字符串形式的代码示例class Demo extends React.Component{ showData=()=>{ // console.log(this) // 专款专用:每一个ref都是唯一的,存在this.refs中 let {ipt1} = this.refs alert(ipt1.value) } showData2=()=>{ let {ipt2} = this.refs alert(ipt2.value) } render(){ return( <div> <input ref="ipt1" type="text" placeholder="请输入数据"/> <button onClick={this.showData}>点我提示左侧的数据</button> <input ref="ipt2" onBlur={this.showData2} type="text" placeholder="请输入数据" /> </div> ) } }2. 回调函数形式的代码示例class Demo extends React.Component{ showData=()=>{ let {input1} = this alert(input1.value) } showData2=()=>{ let {input2} = this alert(input2.value) } render(){ return( <div> {/* 这里是注释~ */} <input ref={ c=>this.input1 = c} type="text" placeholder="请输入数据"/> <button onClick={this.showData}>点我提示左侧的数据</button> <input ref={c=>this.input2 = c} onBlur={this.showData2} type="text" placeholder="失去焦点提示数据" /> </div> ) }}

什么是回调函数?

自己写的函数不是自己调用的这个函数最后执行了3. createRef 代码示例class Demo extends React.Component{ /* React.createRef() 返回一个容器,容量为1,只能存一个,多余会覆盖前者 这个容器中,可以去存储一个指定的DOM。 */ // 专款专用:每一个自定义的ref标记只能给唯一的DOM使用 myRef = React.createRef() // 容量为1,只能存一个,多余会覆盖前者 myRef2 = React.createRef() showData=()=>{ alert(this.myRef.current.value) } showData2=()=>{ alert(this.myRef2.current.value) } render(){ return( <div> <input ref={ this.myRef} type="text" placeholder="请输入数据"/> <button onClick={this.showData}>点我提示左侧的数据</button> <input ref={this.myRef2} onBlur={this.showData2} type="text" placeholder="失去焦点提示数据" /> </div> ) }}注意:

React 官方推荐使用 createRef 创建 ref 容器的方法

4. 效果展示

需求: 自定义组件, 功能说明如下:

点击按钮, 提示第一个输入框中的值当第2个输入框失去焦点时, 提示这个输入框中的值

5. refs 使用场景

refs 通常适合在一下场景中使用:

对DOM 元素焦点的控制、内容选择或者媒体播放;通过对DOM元素控制,触发动画特效;通第三方DOM库的集成。

避免使用 refs 去做任何可以通过

本文链接地址:https://www.jiuchutong.com/zhishi/299409.html 转载请保留说明!

上一篇:使用nvm安装node(使用nvm安装nodejs后无法执行node命令)

下一篇:nginx跨域(nginx解决跨域问题原理)

  • 抖音密友时刻怎么打开(抖音密友时刻怎么找不到)

    抖音密友时刻怎么打开(抖音密友时刻怎么找不到)

  • 钉钉怎么把普通群改成师生群(钉钉怎么把普通人踢出去)

    钉钉怎么把普通群改成师生群(钉钉怎么把普通人踢出去)

  • 华为p40pro屏幕尺寸是多大(华为mate50pro屏幕尺寸)

    华为p40pro屏幕尺寸是多大(华为mate50pro屏幕尺寸)

  • 华为手机智能语音如何关闭(华为手机智能语音怎么开启)

    华为手机智能语音如何关闭(华为手机智能语音怎么开启)

  • 苹果se2中国上市时间(苹果se2上市时间)

    苹果se2中国上市时间(苹果se2上市时间)

  • 微信怎么查etc消费记录(微信怎么查etc消费明细)

    微信怎么查etc消费记录(微信怎么查etc消费明细)

  • 微信群解散了有提示吗(微信群解散了有大数据记录吗)

    微信群解散了有提示吗(微信群解散了有大数据记录吗)

  • 华为平板m5和m5青春版区别(华为平板m5和m5青春版哪个好)

    华为平板m5和m5青春版区别(华为平板m5和m5青春版哪个好)

  • 华为手机怎么将屏幕分成两部分(华为手机怎么将照片导入u盘)

    华为手机怎么将屏幕分成两部分(华为手机怎么将照片导入u盘)

  • 苹果的home键怎么调出来(苹果的home键怎么会有震动)

    苹果的home键怎么调出来(苹果的home键怎么会有震动)

  • 微信扫码进群人数限制(微信扫码进群人数限制怎么解除)

    微信扫码进群人数限制(微信扫码进群人数限制怎么解除)

  • 阿里云服务器是干嘛的(阿里云服务器是linux吗)

    阿里云服务器是干嘛的(阿里云服务器是linux吗)

  • 小爱同学可以当电脑音响用吗(小爱同学可以当路由器吗)

    小爱同学可以当电脑音响用吗(小爱同学可以当路由器吗)

  • 华为手机铃声在哪下载(华为手机铃声在哪里设置来电铃声在哪里设置)

    华为手机铃声在哪下载(华为手机铃声在哪里设置来电铃声在哪里设置)

  • 手机摔地上会对内部有影响吗(手机摔地上会对屏幕有影响吗)

    手机摔地上会对内部有影响吗(手机摔地上会对屏幕有影响吗)

  • 路由器负载是什么意思(无线路由器负载)

    路由器负载是什么意思(无线路由器负载)

  • 如何查看系统日志(如何查看系统日志的Id)

    如何查看系统日志(如何查看系统日志的Id)

  • 怎么下载快手视频(怎么下载快手视频的背景音乐)

    怎么下载快手视频(怎么下载快手视频的背景音乐)

  • iphone11怎么关相机声音(苹果11怎么关闭相机)

    iphone11怎么关相机声音(苹果11怎么关闭相机)

  • 多媒体数据压缩技术作用(多媒体数据压缩编码方法可分为两大类)

    多媒体数据压缩技术作用(多媒体数据压缩编码方法可分为两大类)

  • ps扣完图怎么弄出来(ps抠完图怎么拿出来)

    ps扣完图怎么弄出来(ps抠完图怎么拿出来)

  • ssl协议的主要作用是什么(ssl协议的具体应用有哪些)

    ssl协议的主要作用是什么(ssl协议的具体应用有哪些)

  • WPS页眉页脚插入页码不连续怎么办(wps添加页眉页脚操作)

    WPS页眉页脚插入页码不连续怎么办(wps添加页眉页脚操作)

  • 电池bm46是什么型号(电池bm46是什么型号的手机)

    电池bm46是什么型号(电池bm46是什么型号的手机)

  • 安信安翼为什么打不开(安信安翼下载最新版本)

    安信安翼为什么打不开(安信安翼下载最新版本)

  • 华为p30屏幕供应商(华为p30的屏幕是哪个供应商提供的)

    华为p30屏幕供应商(华为p30的屏幕是哪个供应商提供的)

  • 探探查看谁喜欢我(探探 看谁喜欢我)

    探探查看谁喜欢我(探探 看谁喜欢我)

  • 【Mac显示隐藏文件】苹果Mac操作系统下怎么显示隐藏文件(macbook显示隐藏文件)

    【Mac显示隐藏文件】苹果Mac操作系统下怎么显示隐藏文件(macbook显示隐藏文件)

  • phpcms如何调二级导航(phpcms生成html)

    phpcms如何调二级导航(phpcms生成html)

  • 若依表单中上传文件/图片(表单上传文件)

    若依表单中上传文件/图片(表单上传文件)

  • 税前利润是什么利润
  • 个人所得税抵扣项目有哪些及金额
  • 政府转让土地使用权
  • 哪些单位须执行国家政策
  • 公司贷款可以转私人吗
  • 帮忙劳务派遣
  • 小规模纳税人可以开1%的专票吗
  • 临时人员劳务费有哪些?
  • 垫付生育津贴的钱怎么算
  • 账目不清什么意思
  • 核销债权债务依据
  • 税率修改后对价格的影响
  • 实收资本印花税怎么申报税目
  • 合并报表编织原则
  • 公司改名字麻烦不
  • 个人所得税期末为负数审计调整
  • 简易计税的应交所得税
  • 前期物业管理公司
  • 开发经济适用房是否需要缴纳土增税
  • 暂估原材料已领用还红冲吗
  • 企业稀释股份
  • 高新企业入库是什么意思
  • 个体工商户清算报告
  • 收到押金和支付押金的账务处理
  • 员工辞退补偿金发放逾期
  • 股权变更需要缴纳印花税吗,缴纳多少
  • 房地产开发有限公司英文
  • 单位购买图书会计分录
  • 车辆购置税可以代缴吗
  • php循环语句
  • 定额备用金制度
  • 残疾人就业保障金怎么申报
  • PHP:stream_set_chunk_size()的用法_Stream函数
  • 现金长款怎么做会计分录
  • 贷款的账务处理
  • 申报补缴是什么意思
  • Thinkphp和onethink实现微信支付插件
  • php开发程序
  • 哪些农产品属于免税
  • 材料报废及处置方案
  • In Java, how do I read/convert an InputStream to a String? Stack Overflow
  • 农业合作社需要交土地使用税吗
  • 现金零星支出大还是小
  • 公司进行清算
  • 帝国cms升级到7.5后不能发布内容信息
  • 其他应收款增加会计分录
  • 产品成本计算的分类法适用于( )
  • sqlserver2005 master与msdb数据库备份恢复过程
  • row number函数的使用场景
  • 货物已到发票未开具
  • 其他应收款是负数怎么报税
  • 一般纳税人工程劳务发票税率是多少
  • 异地成立分公司的流程和要求
  • 什么是商业汇票,其种类有哪些
  • 水电费发票没有可以用其他发票抵吗
  • 闽侯县安置房交易缴纳土地出让金
  • 车间报销维修费会计科目
  • 如何调整以前年度库存
  • 以前年度损益调整
  • 网吧的收入怎么做账
  • 现金劳务收入会计分录
  • 预提费用怎么做凭证
  • 直接成本包括哪些
  • 如果一个sql语句中包括两个名字
  • centos7配置tomcat
  • win8.1 开机进桌面
  • 双启动子存在的意义
  • solaris 安装
  • 设备管理器xp系统
  • ubuntu20.04怎么用
  • win10文件资源
  • 红帽子在工地上是什么级别
  • 微信 cookies
  • parentElement,srcElement的使用小结
  • 利用感情骗取钱财算诈骗吗
  • 出租车发票真伪怎么查询
  • 百旺怎么导出数据
  • 江苏省电子税务局电话
  • 如何在网上查看自己的营业执照
  • 广东国家税务局电子税务局官网入口
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设