使用React 应当注意的几个地方

目标人群

献给熟悉基础的React语法的刚接触React的同学~

如果你已经写过半年以上的React那也不用看了,毕竟我水平并不高

What's React

React 是一个不存在的网络公司Facebook出的JavaScript视图框架。

他们官网写着

JUST THE UI

VIRTUAL DOM

DATA FLOW

这三个特性。

当我第一次看到的时候在想,这丫的弱爆了,人家动辄就MVCMVVM的框架,你竟然只写了一个UI?

当然,当时我的想法肯定是错的。

React拥有非常高的性能,结合单向数据流还有组件化思想,可以很舒服的做出现代化的前端产品。

Start

首先,得有开发环境。

Node的安装推荐用nvm,我在上一篇《编译我的开发环境》里有写。

主要是在项目里得加入编译jsx到正常的js

$ npm install --save gulp browserify babelify vinyl-source-stream babel-core

gulpfile.babel.js里加上任务

import gulp from 'gulp';
import browserify from 'browserify';
import babelify from 'babelify';
import source from 'vinyl-source-stream';

gulp.task('jsx',() => {
  return browserify('src/app.js')
    .transform(babelify.configure({
        stage:0
    }))
    .bundle()
    .pipe(source('bundle.js'))
    .pipe(gulp.dest('dist/'));
});

这样,开发环境就大功告成了。

然而,然而。

起初的时候要写React这种代码是比较痛苦的。

平常就是写HTML,然后主要通过jQuery调整页面,完成一些显示的功能。

而React是强迫组件化,强制性的用组件化来构造前端。

这里写我的Live template吧,直接复制粘贴到WebStorm就可以啦

import React from 'react';

class $className$ extends React.Component {

  render() {
    return (
        $content$
      );
  }
}

export default $className$;

ES2015

看到这里,如果同学你不熟悉ES2015的语法可能就感觉看不懂这是什么了,这还是JavaScript么?

如果真的对ES2015语法不太熟悉,可以看看阮一峰老师的书:ECMAScript 6入门

我非常的喜欢ES6的语法,因为写起来非常的清晰明了。看着舒服。

只是绝大部分浏览器现在并不能完全支持ES6,所以需要babel转义。

上面的gulp的jsx task就是完成这样的转义。

Spelling Component

这个问题和中文有关。

当初我因为英文不过关,老是把Component写成Components或者component或者components

这几种都是不行的。都会造成错误,注意一定一定严格的用Component,所以我建议直接复制我的Live template。

Use strict

其实挺纠结的。因为用babel的话他会转义代码,写不写'use strict'其实一个样。

然而我还是建议加上'use strict'。

如果放弃babel,那么我们也可以写出严格的js代码,这样多好。

bind(this)

这里有些很奇怪的问题。有一些情况下这样写会出错

class App extends React.Component {

  handleChange(e) {
    console.log(this);
  }

  render() {
    return (
      <input type="text" onChange={this.handleChange} />
    );
  }
}

对,这个this,有时候不知道为什么this指向就会变。

如果你碰到了这样的问题,可能加一个绑定当前this会有效:

<input type="text" onChange={this.handleChange.bind(this)} />

这个问题并没有深究,留待再碰到再解决吧。

Ajax

不可避免的,构建SPA肯定是要用到Ajax的。

我有时候也想用fetch,但是,这次我怂了。 浏览器兼容性实在是太差了。

chrome 42 才支持。不能指望其他浏览器跟上了。

言归正传,一般情况下Ajax数据是要传到state里面的,所以一般是这样的:

class App extends React.Component {

  fetchSomething() {
    $.ajax({
      url: 'http://foo.com',dataType: 'json',method: 'GET',success: function(res) {
        this.setState({ res: res });
        }
      });
  }

  render() {
    return (...);
  }
}

如果你真的这样写,恭喜你,你会碰到两个坑!

一个是this,在success中的this指向可是XMLHttpRequest的对象哦,并不是App 的class。这个时候一般用的是在外面保存this,然后里面调用

let that = this;

that.setState({});

第二个坑更隐蔽。我当初愣是没想起来。

异步

即使经常写原生js也很容易忽视这个问题。

ajax请求默认是异步的,也就是说,数据尚未传送到客户端的时候,js就已经跑完了客户端的所有代码(好几遍)。V8那个效率,你懂的。

问题来了。数据没有到,那么this.setState也就没有触发,那么后面用数据怎么办?

GG

好了,既然原理知道了,那么解决方法也就很简单了,在Ajax请求的时候改成同步的

$.ajax({
  url: '/foo/bar',async: false,success: function(res){
    this.setState({res});
  }
});

这里也就造成了一个问题,Ajax请求在了主线程上。网络堵塞就完蛋了。。。额,再说吧。

constructor

constructor是ES6的class的构造函数,在React中用处非常的大

class App extends React.Component {
  constructor(props) {
    super(props);

    // do something

    this.state = {
      author: 'Annatar'
    }
  }

  render() {
    return (...);
  }
}

构造函数必须传入props,并且在第一行就得首先调用父类的构造函数。

state的设置在constructor中并不是setState了,而是变成了赋值。就像上面的那样

我就在constructor中调用Ajax。。。

Props

这个是深坑啊。埋了我好长时间。。。

你要是老老实实跟着官网写props,就像这样

class App extends React.Component {

  static PropTypes = {
    url: React.PropTypes.string.isRequired
  }

  static defaultProps = {
    url: '/foo/bar'
  }

  render() {
    return (...);
  }
}

哈哈,正常情况是会报错的!

我经过查资料才得知static目前是ES7草案上的属性,但是React官方已经推荐用了。

默认的babel并没有开启ES7的转义。所以会报错,不认识。

所以我在gulp配置文件中把babelify的stage改成了0.表示所有属性都用,

然后就通过了

React-dom

我目前碰到的最深的坑,没有之一。

我记得之前的写法是React.render(<App />,document.body),嗯,挺正常的。好

后来升级到0.14.0,要引入react-dom,写成这样也挺好的:

import ReactDOM from 'react-dom';

import App from './app';
ReactDOM(<App />,document.body);

嗯,挺好的。看着不错嘛。

但是。。。为毛小版本的升级0.14.2就要换成ReactDOM.render

最坑的是react-router这个项目里面的readme里写的是错误的写法!(现在是正确的)

我当时困惑了足足两个小时。后来哪里都确定了没有问题。就是找不出原因,后来就输出ReactDOM才发现里面丫的藏着一个render方法。这才正确。

一定记得,多看文档。注意,注意,注意,千万只看官方的文档,其他的谁都不可靠!

import ReactDOM from 'react-dom';
// import {render} from 'react-dom'; 也行

import App from './app';
ReactDOM.render(<App />,document.body);
// render(<App />,document.body);

react-router

上面讲了react-router的坑爹文档。这里得说说react-router的坑爹版本号

安装的时候千万别懒省事,不然就直接拷贝:

$ npm install --save history react-router@latest

我当时就是懒得打最后的@latest,导致怎么都没办法显示效果。也是找了大半天的问题。后来才发现Router是undefined

别懒省事就成了。

Others

关于Flux理解不够深,也没有用。

反正我现在看到react-router就后背凉飕飕的。Redux也是这老大做的吧。感觉菊花一紧。。。

下一步

从一开始的别扭,到现在不写React的别扭,转变其实还是蛮大的。

关于React的探索,这里并不是终点。

其他的,动画,Flux,React-Native,Meteor都是未来要研究的东西。

好好学习吧,少年~

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom