余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

学习 React.js 需要了解的一些概念(react和reactjs关系)

xiyangw 2022-11-26 17:04 20 浏览 0 评论

大家好,我是前端西瓜哥。

React.js 是被广泛使用的用于构建用户界面的 JS 库。下面给大家介绍一下学习 React 需要了解的一些概念。

学习 React.js 需要了解的一些概念(react和reactjs关系)

声明式

在 React 这类框架流行之前,我们更新 UI,都是命令式的:我们需要手动指定元素,然后命令它改变样式。

// 纯 JS 写法
document.querySelector('#content') = '前端西瓜哥';
// JQuery 写法
$('#content').text('content');

这种写法其实是相当繁琐的。你可能需要给元素加上 id,加上 class 作以区分,可能还需通过查找当前元素的父元素来界定区域,然后手动作添加子元素、进行修改样式、移除等操作。

所有的事情,都要自己一个个去操作,事无巨细,容易写错。

React 和 Vue 这类框架的出现,让实际项目开发中命令式的写法成为了历史(只是偶尔还是会用到一点命令式写法)。

React 的编码是 声明式 的,你只需要维护好状态,然后在必要的时候通知 React,React 会自动帮你将 UI 渲染好。

class Compoent extends React.Component {
  state = { content: '前端西瓜哥' };
  updateContent = () => {
    this.setState({ content: 'fe_watermelon' });
  };
  render() {
    return (
      <div>
        <div>{this.state.content}</div>
        <button onClick={() => this.updateContent()}>更新 content</button>
      </div>
    );
  }
}
// 渲染为
// <div>前端西瓜哥</div>

React 中用 state 对象来保存可能会发生变化的状态,然后在 HTML 中用 {变量} 的方式嵌入,并通过 setState() 方法来更新状态,并重新渲染 UI。

UI = f(data)

数据映射到 UI 的操作过程,全部交给 React 做了,再也不用担心自己手写的 DOM 更新写错了。你要做的只是更新状态,以及设置好状态在 HTML 中渲染的地方。

这种修改好状态,然后调用方法更新 UI 的做法,其实挺像做小游戏的。比如我们要做一个俄罗斯方块,当发生动作时,我们要更新好每个像素的位置(更新数据),然后调用自己实现的 render 方法,先清空画布,然后一个个绘制出来(映射 UI)。

组件化

组件化是什么?其实就是将模板、样式、脚本组合起来,成为一个组件。我们编写好一个个小的组件,然后将组件组合起来,就组成了我们的 UI 界面。

要想构建复杂的应用,合适的抽象是很重要的。对于 UI 来说,一种比较正确的思路,是将 UI 的分割成各个部分,我们只需要专注于一个职责专一的组件上,完成它后,再和其他的组件联合在一起,一点点构建出复杂的应用。

比如一个待办功能,我们可以抽象成下面这个样子。

<TodoContainer>
  <TodoInput />
  <TodoList />
</TodoContainer>

虚拟 DOM

为了高效地更新 DOM,React 的底层使用了虚拟 DOM 来表示真实的 DOM 结构。

没有使用真实 DOM,是因为真实 DOM 对象比较复杂,有非常多的属性,比较占内存,所以抽象了一层 虚拟 DOM,此外还能附带上组件节点。

当状态更新时,会对比新旧虚拟 DOM 树得到补丁,通过打补丁的方式去更新真实 DOM 树。

React 中新旧 DOM 对比算法做了优化,要比普通的树比较算法要高效,这是 React 能被运用到实际生产环境的一个重要原因。

跨平台

得益于 React 中虚拟 DOM 的实现,React 支持通过 React Native 编译为其他平台语言,来构建移动原生应用,比如 Andorid 或 iOS 原生应用。

虚拟 DOM 其实是真正 DOM 的一层抽象,这个抽象和平台无关,因此我们可以根据这层抽象去做跨平台的实现,让一套代码得以运行在不同平台。

但虚拟 DOM 并不能涵盖不同平台一些特有的 API,所以你其实还是要懂一些原生 APP 的知识的,对一些情况做特殊处理。

但至少,React 提供了一种跨平台的方案。

JSX

React 首先是一个 JS 库,它的语法不能跳脱 JS 的语法。在 JS 环境中,React 通过 React.crreatElement 来描述 DOM。

创建一个内容为 this.state.content 的 div 元素,我们需要这样写。

const el = React.createElement('div', {}, this.state.content);

第一个是 HTML 元素名或组件名,第二个是属性,第三个是子元素或子组件。

只是描述的一个 DOM 元素还算简单,但我们的页面是由复杂的 DOM 元素组织而成的,如果用上面这种写法,代码容易出错,也不方便进行维护。

于是 React 推出了 JSX,全称为 JavaScript Syntax Extension,即 JS 语法的扩展增强。通过 JSX,我们就可以实现 “在 JS 中写 HTML”。

const el = <div>{this.state.content}</div>;

但 JSX 还是不能被浏览器识别,需要编译为 JS。编译后,里面的这种 <div></div> 就会转换为使用了 React.createElement('div') 的代码。

单向数据流

React 要求数据从父组件通过 props 流向子组件,这样就能更好地定位组件中的某个数据的来源。

当然我们还是可以通过额外传递一个可以修改父组件状态方法给子组件,通过它去更新传给子组件的数据。

这样就能实现双向的数据流,但它依旧是显式的,仍然有助于理解程序的运转流程。

React Hooks

React 支持通过类或函数的方式编写组件,分别称为 类组件函数组件

类组件可以创建对象,所以自身可以维护状态是理所当然的事情。

一般来说,函数组件是不支持状态的,因为它是一个函数,只会接收外部传入的数据,然后渲染,内部没办法保持状态,因为它不是对象,只是一个用完就结束的函数。

函数组件不能使用内部状态的这种情况,在 React 推出了 React Hooks 之后解决了。

const Compoent = () => {
  const [content, setContent] = useState('前端西瓜哥');
  return (
    <div>
      <div>{content}</div>
      <button onClick={() => setContent('fe_watermelon')}>更新</button>
    </div>
  );
};

我们在函数组件内使用 useState() 就可以创建一个内部状态,且可以通过 setXxx() 进行更新。

我第一次看到 React Hooks,就觉得这简直就是魔法,惊为天人。

底层其实是用一个额外的有序列表保存好了每个状态,和函数组件进行了绑定。为了做到这点,React 要求 Hooks 必须在每次执行时,保证顺序相同。

React Hooks 的一个优点是,将逻辑的最小单元从组件,缩小为更细粒度的 hooks 的组合。这让我们编写组件更加灵活。

相关推荐

听听别人怎么说:VueJS 与 ReactJS(请简单介绍vue和react之间的区别)
听听别人怎么说:VueJS 与 ReactJS(请简单介绍vue和react之间的区别)

使用所有新的库和框架,很难跟上所有这些库和框架,也就是说,这就需要您决定哪些是值得花时间的。让我们看看人们说什么:“和Vue.JS一起工作是很愉快的,我发现学习...

2023-03-21 19:48 xiyangw

学习笔记-身份认证攻击漏洞,文件上传漏洞(认证身份信息)

身份认证攻击漏洞身份认证机制:基于会话的验证使用基于会话的身份验证(或会话cookie身份验证或基于cookie的身份验证),用户的状态存储在服务器上。它不需要用户在每个请求中都提供用户名或密码。...

2020Web前端常见面试题及答案-每日三道题(web前端面试常问知识)
2020Web前端常见面试题及答案-每日三道题(web前端面试常问知识)

web前端面试题及答案问题:网页验证码是干嘛的,是为了解决什么安全问题?解析:(1)区分用户是计算机还是人的公共全自动程序。可以防止恶意破解密码、刷票、论坛灌水...

2023-03-21 19:48 xiyangw

Web 应用常见安全漏洞(web安全十大漏洞)

1、SQL注入SQL注入就是通过给web应用接口传入一些特殊字符,达到欺骗服务器执行恶意的SQL命令。SQL注入漏洞属于后端的范畴,但前端也可做体验上的优化。原因当使用外部不可信任的数据...

文件上传漏洞全面渗透姿势总结(文件上传漏洞常发生在哪些功能点)
文件上传漏洞全面渗透姿势总结(文件上传漏洞常发生在哪些功能点)

文件上传的场景真的随处可见,不加防范小心,容易造成漏洞,造成信息泄露,甚至更为严重的灾难。比如某博客网站评论编辑模块,右上角就有支持上传图片的功能,提交带有恶意...

2023-03-21 19:47 xiyangw

这一次 带你彻底了解Cookie(cookiev)
这一次 带你彻底了解Cookie(cookiev)

前言网络早期最大的问题之一是如何管理状态。简而言之,服务器无法知道两个请求是否来自同一个浏览器。当时最简单的方法是在请求时,在页面中插入一些参数,并在下一个请求...

2023-03-21 19:47 xiyangw

【反诈征文展播】(二)谨防网络诈骗(反网络诈骗文章)
【反诈征文展播】(二)谨防网络诈骗(反网络诈骗文章)

谨防网络诈骗甘州区青年东街小学四4班家长:王飞随着计算机技术、互联网的发展及信息技术的进步,网上银行、网络炒股、网络购物等网络商业活动的日渐兴起,在人们沉...

2023-03-21 19:46 xiyangw

四月前端面试题总结:前端面试总结(下篇)(2021前端的面试题及答案)
四月前端面试题总结:前端面试总结(下篇)(2021前端的面试题及答案)

接着昨天的前端面试题总结写的哈,有在找工作的伙伴,建议仔细阅读!10.什么是原型链原型:每个javascript创建的时候都会关联另一个对象,这个对象就是原型,...

2023-03-21 19:46 xiyangw

客户端JavaScript的限制(javascript客户端脚本编程)

处于安全的考虑,客户端的js运行会受到种种限制,下面就让我们来了解一下。浏览器的限制浏览器限制了JavaScript任务的运行时间。这种限制是有必要的,它确保某些恶意代码不能通过永不停止的密集操作锁住...

前端面试干货:四月份前端面试题总指南(下篇)
前端面试干货:四月份前端面试题总指南(下篇)

接着昨天的前端面试题总结写的哈,有在找工作的伙伴,建议仔细阅读!10.什么是原型链原型:每个javascript创建的时候都会关联另一个对象,这个对象就是原型,...

2023-03-21 19:46 xiyangw

网页出现禁止复制黏贴的内容如何破解(网页禁止粘贴破解)
网页出现禁止复制黏贴的内容如何破解(网页禁止粘贴破解)

我们查询网页的时候,想复制网页上的部分内容,结果出现请先登陆或者是连提示也没有,有的复制加了个小尾巴,如何操作,且听早早道来主要破解思路是:禁用js+取消use...

2023-03-21 19:45 xiyangw

SEO优化中 JavaScript错误可能会影响页面收录
SEO优化中 JavaScript错误可能会影响页面收录

Google的搜索开发倡导者马丁·斯普利特(MartinSplitt)表示:“通常情况下,页面不收录一些问题出在其他方面,我首先会指责JavaScript。”...

2023-03-21 19:45 xiyangw

网络安全知识——深入剖析恶意攻击性网页(恶意网站的危害是什么)

最近越来越多的个人网站都采用了恶意攻击性网页,从开始的只是修改IE首页地址,强迫大家一打开IE就进入他的主页来提高主页访问量,愈演愈烈,到最后发展到锁定IE部分功能阻止用户恢复,甚至有的网页浏览后造成...

这样设置,百度文库就可以复制了(百度文库怎么可以复制)
这样设置,百度文库就可以复制了(百度文库怎么可以复制)

百度文库中word复制不了文字,右键复制,提示是VIP特权。按下面方面破解。一、页面空白处右键,选择“审查元素”,或直接按F12;二、按F1出现设置;或点击下面...

2023-03-21 19:45 xiyangw

JavaScript容错的优雅地降级功能(js降序排序)
JavaScript容错的优雅地降级功能(js降序排序)

探测到错误时禁用组件是一回事。处理出错的组件并将其从UI中优雅地移除是另一回事。即使我们努力保持组件之间松耦合,但涉及到DOM时,这项工作会变得很有难度。例如,...

2023-03-21 19:44 xiyangw

取消回复欢迎 发表评论: