前言

React作为Facebook 内部开发 Instagram 的项目中,是一个用来构建用户界面的优秀 JS 库,于 2013 年 5 月开源。作为前端的三大框架之一,React的应用可以说是非常的广泛,包括BAT在内的许多大公司很多项目都是基于其开发的。

Vue:除了VDom之外,Vue的响应性能和React相比还是有很大的区别,无论是本身的语法层面还是外围的第三方支持软件,总之,迁移起来不会是那么容易的事情。

但是作为一名热爱前端的技术人员,学习优秀的技术栈仿佛已经成了一种习惯,在这里结合阮一峰React以及对阮一峰老师15年的教程进行版本更新,简单介绍一下React的入门,本文中所有demo代码都以图片形式展示,目的是建议手打尝试,而不是直接复制,如需代码可以点击这里。


使用 create-react-app 快速构建 React 开发环境

create-react-app 是来自于 Facebook,通过该命令我们无需配置就能快速构建 React 开发环境。

create-react-app 自动创建的项目是基于 Webpack + ES6 。

  • yarn add create-react-app -g
  • create-react-app projectName
  • cd projectName
  • yarn start

然后打开浏览器输入http://localhost:3000/,就可以看到React的六芒星LOGO了。
以下是React重要的部分

  • JSX – 允许我们编写类似HTML的语法 转换为lightweightJavaScript对象。
  • 虚拟DOM – 实际DOM的JavaScript表示。
  • React.Component – 您创建新组件的方式
  • render(方法) – 描述特定组件的 UI 外观 。
  • ReactDOM.render – 将React组件渲染到DOM节点。
  • state – 组件的内部数据存储(对象)。
  • constructor(this.state) – 建立组件初始 state(状态) 的方式。
  • setState – 一种辅助方法,用于更新组件的 state(状态) 并重新渲染 UI。
  • props – 从父组件传递给子组件的数据。
  • propTypes – 允许您控制传递给子组件的某些 props(属性) 的存在或类型。
  • defaultProps – 允许您为组件设置默认 props(属性) 。
  • 组件的生命周期:
    1. componentDidMount – 装载组件后触发
    2. componentWillUnmount – 在组件卸载之前触发
    3. getDerivedStateFromProps – 当组件装载时以及每当props 更改时触发。 用于在其 props(属性) 更改时更新组件的状态
  • 事件:
    1. onClick
    2. onSubmit
    3. onChange

React的JSX语法

HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的语法,它允许 HTML 与 JavaScript 的混写

因为React没有vue那样的v-for一键循环,所以要自己手动用map来实现 效果图:


React组件嵌套组件以及数据传递子组件

vue通过子组件中的props来传递数据,而React则是用this.props.attr来传递,注意,没有$符号! 组件类的第一个字母必须大写,否则会报错,比如HelloMessage不能写成helloMessage。另外,组件类只能包含一个顶层标签,否则也会报错。

JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员.我们定义了一个arr,里面是2个标题标签,通过在ul模板中添加{arr}来实现效果**(注意不是vue的"",两者不要搞混了)**


this.props.children

this.props.attr是取到组件传递过来的数据或属性,而this.props.children则表示组件的所有子节点,可以通过this.props.children.map来遍历出来验证。


React之PropTypes

组件的属性可以接受任意值,字符串、对象、函数等等都可以。有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求。

组件类的PropTypes属性,就是用来验证组件实例的属性是否符合要求

yarn add prop-types
import PropTypes from 'prop-types'

MyTitle中有一个title属性,他的值为一个字符串,我们可以通过MyTitle.propTypes来定义该组件中属性的类型.如果将title: PropTypes.string改为其他类型,就会报以下的错误。

React之ref

  1. 同vue的ref作用一样,组件并不是真实的DOM节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM。
  2. 只有当它插入文档以后,才会变成真实的 DOM 。根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff ,它可以极大提高网页的性能表现。
  3. 但是,有时需要从组件获取真实 DOM 的节点,这时就要用到 ref 属性。
    图片放的太多了,在这里贴一下代码..请忽视开头说的话..
class App extends Component {handleClick () {this.refs.myTextInput.focus()}render() {return (<div className="App"><LikeButton/><input type="text" ref="myTextInput"/><input type="button" value="Focus the text input" onClick={ this.handleClick.bind(this) }/></div>);}}
复制代码

在这里需要强调的是,React的事件中如果不用剪头函数,那就要用bind来绑定this。


React之this.state以及点击事件

React中的state就相当于vue里的data数据存储,而小程序的this.setData,大家懂的..

class LikeButton extends Component {state = {liked: false}handleClick () {// console.log(this)this.setState({liked: !this.state.liked})}render() {const text = this.state.liked?'liked':'don\'t like'return (<p onClick={ () => this.handleClick() }>You { text } this.click to toggle</p>)}
}
复制代码

在这里定义一个text变量,通过state中的liked来判断text的值,然后再通过onClick点击事件来反复改变liked的值,效果可以自己通过代码实现看看,就是普通的MVVM模型。


React之实现双向数据绑定

vue里面v-model一键实现的事情React又没有-0-,不过我们可以通过onChange事件来简单实现它,直接上代码.

class App extends Component {state= {value: 'Hello!'}handleChange (event) {this.setState({value: event.target.value})  }render() {const val = this.state.valuereturn (<div className="App"><div><input type="text" value={val} onChange={this.handleChange.bind(this)}/><p>{ val }</p></div></div>);}
}
复制代码

React之组件生命周期

组件的生命周期分成三个状态:

  • Mounting:已插入真实 DOM
  • Updating:正在被重新渲染
  • Unmounting:已移出真实 DOM

React 为每个状态都提供了两种处理函数,will 函数在进入状态之前调用,did 函数在进入状态之后调用,三种状态共计五种处理函数。

  • componentWillMount(): 在插入真实DOM之前调用
  • componentDidMount(): 在插入真实DOM之后调用
  • componentWillUpdate(object nextProps,object nextState): 在被重新渲染之前调用
  • componentDidUpdate(object prevProps, object prevState): 在被重新渲染之后调用
  • componentWillUnmount(): 在移除真实DOM之前调用

此外,React 还提供两种特殊状态的处理函数。

  • componentWillReceiveProps(object nextProps):已加载组件收到新的参数时调用
  • shouldComponentUpdate(object nextProps, object nextState):组件判断是否重新渲染时调用

另外,组件的style属性的设置方式也值得注意,不能写成style="opacity:{this.state.opacity};"而要写成style={{opacity: this.state.opacity}}

结语

作为一个前端程序猿很不容易,前端的技术更新太快,也出现了“别更新了,老子学不动了”这类前端的梗。不过前端层出不穷的技术让我们看到了前端的未来,我们都是热于分享的人,希望正在学习的我也能够帮助到正在学习的你。 这些demo都在我的github,感兴趣的朋友可以clone下来看下,最近搭了一个个人blog,欢迎来踩,PC端主题一股科幻风有没有!!主题来自于hexo主题 最后说一句!很重要!如果我的这篇文章帮助到了你,那你可以点个star再走嘛~一起upupup!

Vue会了吗?来认识一下React吧(上)相关推荐

  1. 译文 | Vue 在哪些方面做的比 React 更好?

    大家好,我是若川. 在过去的五年中,我一直是一名 React 工程师.我爱React.我喜欢开发 React 应用程序.我认为它是目前最好的UI框架之一. 但是,在这个领域有一些竞争对手.其中最大的是 ...

  2. 为什么Vue(默认情况下)比React性能更好

    本文不是要辩论 Vue 好还是 React 好,而是要看看这两个框架在低层次上是如何选择的. 我知道有些开发者在选择框架之前会倾向于看基准.然而,这并不是最关键的方面,因为99%的性能都来自于你写的代 ...

  3. canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传

    使用方法 项目中引入 npm install html2canvas html代码 //html代码 js代码 // 引入html2canvas import html2canvas from 'ht ...

  4. vue本地上传并预览php,vue.js 实现图片本地预览 裁剪 压缩 上传功能

    以下代码涉及 Vue 2.0 及 ES6 语法. 目标 纯 javascrpit 实现,兼容ie9及以上浏览器,在本地做好文件格式.长宽.大小的检测,减少浏览器交互. 现实是残酷的,为了兼容Ie9 还 ...

  5. 学习React第三篇:在React组件上设置属性(PropTypes)

    继编写 使用组件的render方法在React中显示输出 接下来,在React组件上设置属性: 那我们如何在React中传递数据的方式. 我们将了解一下React中的propTypes和default ...

  6. 前端(react)上传到阿里云OSS存储 实例

    需求背景 由于现有的后台管理系统,上传的视频越来越大,加上上传视频较慢,后端小哥提出直接从前端上传视频或者其他文件到阿里云OSS存储. 阿里云OSS 阿里云OSS文档介绍,这里不做过多赘述 安装 原本 ...

  7. vue 页面回跳两个界面(返回上一页两次)

    vue 页面回跳两个界面(返回上一页两次) this.$router.go(-2);

  8. 前端vue适配不同的分辨率_浅析 React / Vue 跨端渲染原理与实现

    当下的前端同学对 React 与 Vue 的组件化开发想必不会陌生,RN 与 Weex 的跨界也常为我们所津津乐道.UI 框架在实现这样的跨端渲染时需要做哪些工作,其技术方案能否借鉴乃至应用到我们自己 ...

  9. 为什么我们从Angular 2迁移到Vue.js(为什么我们没有选择React)

    在Rever(www.reverscore.com),我们刚刚使用Vue.js发布了我们的Web客户端的新版本.经过641次提交和16周的紧张开发,我们非常自豪之前做出的决定. 8个月前,我们的前端在 ...

最新文章

  1. Go 学习笔记(39)— Go 反射
  2. 定时自动启动任务crontab命令用法
  3. poj 3485 区间选点
  4. Air与java通信
  5. Blue Jeans - POJ 3080(多串的共同子串)
  6. linux下查看vnc端口_linux vnc的默认端口修改
  7. keil+flymcu+CubeMX开发STM32F407
  8. Pandas速查手册中文版
  9. android中svn合并分支,Android Studio之SVN打分支、切换分支及合并分支
  10. Qt拖拽实现绘制流程图
  11. ckfinder java 配置_JAVA里使用CKEditor和CKFinder的配置
  12. ArcGIS JS之 identify接口之 exceededTransferLimit属性
  13. Linux下读取RFID卡号(C串口编程)
  14. x64dbg 调试 EXCEPTION_ACCESS_VIOLATION C0000005
  15. c语言如何实现正负交替输出指令,C语言的谜题
  16. php 图片mete_data,进入多摄时代后,摄像头成了手机的「第二张脸」
  17. java培训记录Day02 2022/3/15星期二
  18. 不用软件测试火车速度,实测八款抢火车票软件 优先出票权仅拼速度非真正优先...
  19. SAR成像系列:【1】合成孔径雷达(SAR)成像概述
  20. PICE(5):MongoDBStreaming - gRPC -MGO Service

热门文章

  1. java怎么添加地图_javaweb怎样添加百度地图
  2. android gridview item 边框,Android实现为GridView添加边框效果
  3. 加速数据分析,这12种高效Numpy和Pandas函数为你保驾护航
  4. fasttext在二分类问题中,recall与precision值是相同的,why
  5. KMP算法之 好理解的模板
  6. 【大学课程】操作系统知识点
  7. 项目范围管理——知识要点
  8. 若依微服务版在Windows上通过jar包运行业务模块时提示:Failed to determine s suitable driver class
  9. Oracle11g服务详细介绍及哪些服务是必须开启的?
  10. AndroidStudio跑起来第一个App时新手遇到的那些坑