广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >使用react框架需要注意什么
  • 824
分享到

使用react框架需要注意什么

2024-04-02 19:04:59 824人浏览 独家记忆
摘要

这篇文章主要为大家展示了“使用React框架需要注意什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“使用react框架需要注意什么”这篇文章吧。这篇文章主要是

这篇文章主要为大家展示了“使用React框架需要注意什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“使用react框架需要注意什么”这篇文章吧。

这篇文章主要是写关于学习react中的一些自己的思考:

1.setState到底是同步的还是异步的?

2.如何在子组件中改变父组件的state

3.context的运用,避免“props传递地狱”

4.组件类里有私有变量a,它到底改放在this.a中还是this.state对象中(作为属性a)呢?

1.setState到底是同步的还是异步的?

class MyComponent extends React.Component{
 constructor(props) {
  super(props)
  this.state ={
  value:0
  }
 }
handleClick = () => {
  this.setState({value:1})
   console.log('在handleClick里输出' + this.state.value);
}
render(){
   console.log('在render()里输出' + this.state.value);
return (<div>
   <button onClick ={this.handleClick}>按钮</button>
  </div>)
  }
}
export default MyComponent
//省略渲染过程,下面也一样

在这里我们点击按钮时,调用handleClick函数,首先调用this.setState()设置value,随即把this.state.value输出,结果是什么?

你可能会想,这还不简单——“在handleClick里输出1”呗,然而你错了,它的结果为:

使用react框架需要注意什么

事实上,setState()的调用是异步的,这意味着,虽然你调用了setState({value:0}),但this.state.value并不会马上变成0,而是直到render()函数调用时,setState()才真正被执行。结合图说明一下:

使用react框架需要注意什么

你可能又会问了:要是我在render()前多次调用this.setState()改变同一个值呢?(比如value)

我们对handleClick做一些修改,让它变得复杂一点,在调用handleClick的时候,依次调用handleStateChange1 ,handleStateChange2,handleStateChange3,它们会调用setState分别设置value为1,2,3并且随即打印

handleStateChange1 = () => {
  this.setState({value:1})
  console.log('在handleClick里输出' + this.state.value);
}
handleStateChange2 = () => {
  this.setState({value:2})
  console.log('在handleClick里输出' + this.state.value);
}
handleStateChange3 = () => {
  this.setState({value:3})
  console.log('在handleClick里输出' + this.state.value);
}
handleClick = () => {
  this.handleStateChange1();
  this.handleStateChange2();
  this.handleStateChange3();
}

那么输出结果会是什么呢?如果setState是同步调用的,那么结果显然为

在handleClick里输出1

在handleClick里输出2

在handleClick里输出3

但是结果为:,证明它是异步的

使用react框架需要注意什么

这下好理解了吧,配合这幅图:

使用react框架需要注意什么

2.如何在子组件中改变父组件的state呢?

这是我们经常会遇到的问题之一,解决办法是:在父组件中写一个能改变父组件state的方法,并通过props传入子组件中

class Son extends React.Component{
 render(){
  return(<div onClick = {this.props.handleClick}>
    {this.props.value}
    </div>)
   }
}
class Father extends React.Component{
 constructor(props){
   super(props)
   this.state ={
    value:'a'
    }
  }
 handleClick = () => {
   this.setState({value:'b'})
  }
 render(){
   return (<div style ={{margin:50}}>
      <Son value = {this.state.value} handleClick = {this.handleClick}/>
     </div>)
   }
}

点击子组件Son,内容由a变成b,说明父组件的state被修改了

使用react框架需要注意什么

使用react框架需要注意什么

3.context的运用,避免“props传递地狱”

3.1假设一个比较极端的场景:你需要从你的子组件里调用父父父父父组件的属性或方法,怎么办!当组件嵌套层级过深的时候,不断地传props作为实现方式简直就是噩梦!我称之为“props传递地狱”(这个词是我瞎编的,参考自“回调函数地狱”)

我们接下来实现的是这样一个需求,把gene属性(基因)从组件GrandFather -->Father --> Son传递,如果用props传递:

class Son extends React.Component{
 render(){
  return (<h4 style ={{marginTop:30}}>我从我的爷爷那里得到了基因--{this.props.gene}</h4>)
  }
 }
class Father extends React.Component{
 render(){
  return (<Son gene = {this.props.gene}/>)
 }
}
class GrandFather extends React.Component{
 constructor(props) {
  super(props)
  this.state ={
  gene:'[爷爷的基因]'
  }
 }
 render(){
  return (<Father gene = {this.state.gene}/>)
 }
}

demo:

使用react框架需要注意什么

【(。・`ω&acute;・)虽然听起来有点怪怪的但是大家别介意哈】

实现是实现了,但你想想,假设不是从“爷爷”组件,而是从“太太太太爷爷”组件传下来,这多可怕!不过没关系,react提供了一个叫做context(上下文)的api,你在顶层组件的context中定义的属性,可以在所有的后代组件中,通过this.context.属性去引用!让我们一睹为快:

class Son extends React.Component{
 render(){
  console.log(this.context.color);
  return (<h4 style ={{marginTop:30}}>我从我的爷爷那里得到了基因--{this.context.gene}</h4>)
  }
}
Son.contextTypes ={
  gene:React.PropTypes.string
}
class Father extends React.Component{
 render(){
  return (<Son/>)
  }
}
class GrandFather extends React.Component{
 getChildContext(){
  return {gene:'[爷爷的基因]'}
 }
 render(){
  return (<Father />)
 }
}
GrandFather.childContextTypes = {
  gene: React.PropTypes.string
};
export default GrandFather

demo效果同上!这个时候你发现,我们在<GrandFather>组件和<Father>组件中都没有向下传递props,我们就从最下层的Son组件中获取了gene属性,是不是很方便!

解释下代码:

getChildContext()是你在顶层组件中定义的钩子函数,这个函数返回一个对象——你希望在后代组件中取用的属性就放在这个对象中,譬如这个例子中我希望在Son组件中通过this.context.gene取属性,所以在getChildContext()中返回{gene:'[爷爷的基因]'}

GrandFather.childContextTypes和Son.contextTypes 用于规定顶层组件和取顶层组件context的后代组件的属性类型

【注意】GrandFather.childContextTypes和Son.contextTypes 这两个对象必须要规定!否则context只能取到空对象!一开始我犯的这个错误简直让我狂吐三升血。。。。

有图有真相之context和props的区别

使用react框架需要注意什么

3.2context是否推荐使用?

虽然上面这个例子说明了context多么好用,但注意:官方并不推荐经常使用它,因为它会让你的应用架构变得不稳定(官方文档原话If you want your application to be stable, don't use context),在我看来,为什么在大多数情况下要使用props而不是实现数据流呢,因为props凭借组件和组件间严密的逻辑联系,使得你能够清晰地跟踪应用的数据流(it's easy to track the flow of data through your React components with props)当然了,如果你遇到上述的例子的情况,context还是大有裨益的

3.3需要改变context中的属性时候,不要直接改变它,而是使用this.state作为媒介,如果你试图在顶层组件的state中放入一个可变的属性你可以这样做:

getChildContext(){
  return {type:this.state.type}
}

3.4在上述我限制gene的类型时候我是这样写的:gene: React.PropTypes.string,使用了React内置的React.PropTypes帮助属性,此时我的版本为 "react": "15.4.2",在15.5的版本后这一帮助属性被废弃,推荐使用props-types库,像这样:

const PropTypes = require("Prop-Types");
GrandFather.childContextTypes = {
  gene: PropTypes.string
};

当然,在这之前你需要npm install prop-types

4.组件类里有私有变量a,它到底改放在this.a中还是this.state对象中(作为属性a)呢?

这得根据它是否需要实时的重渲染决定,如果该变量需要同步到变化的UI中,你应该把它放在this.state对象中,如果不需要的话,则把它放在this中(无代码无demo)

以上是“使用react框架需要注意什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网node.js频道!

--结束END--

本文标题: 使用react框架需要注意什么

本文链接: https://www.lsjlt.com/news/72684.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用react框架需要注意什么
    这篇文章主要为大家展示了“使用react框架需要注意什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“使用react框架需要注意什么”这篇文章吧。这篇文章主要是...
    99+
    2022-10-19
  • 使用react框架需要注意哪些事项
    本篇内容主要讲解“使用react框架需要注意哪些事项”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用react框架需要注意哪些事项”吧!1.setState到底是同步的还是异步的?class&...
    99+
    2023-06-05
  • iframe框架使用要注意什么
    使用iframe框架时,需要注意以下几点:1. 安全性:由于iframe可以嵌入来自不同源的内容,因此需要注意安全性问题。确保嵌入的...
    99+
    2023-10-09
    iframe
  • 使用View.post()需要注意什么
    这篇文章给大家分享的是有关使用View.post()需要注意什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言有时候,我们会需要用到 View.post() 方法,来将一...
    99+
    2022-10-19
  • 使用HTML5 Canvas需要注意什么
    小编给大家分享一下使用HTML5 Canvas需要注意什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 下面对我们在实际开发...
    99+
    2022-10-19
  • 使用ADO.NET时需要注意什么
    小编给大家分享一下使用ADO.NET时需要注意什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用ADO.NET时,出现了一个严重的问题,ADO.NET统一了数...
    99+
    2023-06-17
  • C#中使用CLR需要注意什么
    这篇文章主要为大家展示了“C#中使用CLR需要注意什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中使用CLR需要注意什么”这篇文章吧。1、C# CLR之foreach的性能问题 fore...
    99+
    2023-06-17
  • VS2003版本使用需要注意什么
    这篇文章主要讲解了“VS2003版本使用需要注意什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VS2003版本使用需要注意什么”吧!VS2005可以很方便的帮我们把VS2003开发的as...
    99+
    2023-06-17
  • java中CAS使用需要注意什么
    这篇文章将为大家详细讲解有关java中CAS使用需要注意什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queu...
    99+
    2023-06-14
  • 使用Linux桌面需要注意什么
    这篇文章主要介绍使用Linux桌面需要注意什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!这个问题没有轻松的答案,如果你是新用户,之前没有用过任何Linux桌面,更是这样。围绕这个话题而写的文章大多数也没有多大帮助...
    99+
    2023-06-10
  • js使用语法需要注意什么
    本篇内容介绍了“js使用语法需要注意什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明在js中严格区分大小写。其实这是用来排错的。正常写...
    99+
    2023-06-20
  • Kali Linux需要注意什么
    这期内容当中小编将会给大家带来有关Kali Linux需要注意什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Kali Linux 在渗透测试和白帽子方面是业界领先的 Linux 发行版。默认情况下,该...
    99+
    2023-06-28
  • python自动化框架搭建要注意什么
    搭建Python自动化框架时,需要注意以下几点: 选择合适的测试框架:Python中有多种测试框架可供选择,如unittest、...
    99+
    2023-10-24
    python
  • Xamarin.Forms使用Slider需要注意什么问题
    这篇文章主要为大家展示了“Xamarin.Forms使用Slider需要注意什么问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Xamarin.Forms使用Slider需要注意什么问题”这篇...
    99+
    2023-06-04
  • DLOG4J在使用MySQL时需要注意什么
    这篇文章主要介绍“DLOG4J在使用MySQL时需要注意什么”,在日常操作中,相信很多人在DLOG4J在使用MySQL时需要注意什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2022-10-18
  • 使用免费空间需要注意什么
    使用免费空间需要注意:1、选择免费空间时需要了解清楚申请规则,提高开通空间的效率;2、选择免费空间没有直接利润,因此主机商提供的售后服务相对比较慢;3、在使用免费空间过程中如果有疑问,主机商不提供教学义务,需要自行解决问题;4、免费空间性能...
    99+
    2022-10-17
  • 注册域名需要注意什么
    本篇内容介绍了“注册域名需要注意什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一,域名注册商的时候,要了解该注册的品牌。尽量挑选老练,...
    99+
    2023-06-06
  • 使用hooks写React组件需要注意的5个地方
    目录01.不需要render的场景下使用useState 02.使用了router.push而非link 03.通过useEffect来处理actions 04.单一职责组件 05....
    99+
    2022-11-12
  • 在使用GO框架时,Git和IDE有哪些需要注意的问题?
    在开发过程中,Git和IDE是程序员最常用的工具之一。Git作为一个版本控制工具,可以帮助我们更好地管理我们的代码,而IDE则可以提高我们的开发效率。在使用GO框架时,Git和IDE也不可或缺。但是,有些问题需要我们注意,本文将介绍在使用...
    99+
    2023-09-01
    框架 git ide
  • mysql建表需要注意什么
    本篇文章和大家了解一下mysql建表需要注意什么。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。一、mysql各个名称库名、表名、字段名全部使用小写字母,用'_'下划线分割...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作