Skip to content
 
 

Latest commit

 

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

React学习笔记📒

  • 知识来源:
  • 慕课网:React.js入门与案例开发
  • 《React全栈-Redux+Flux+webpack+Babel整合开发》

目录

  • 01-01 基础知识目录与相关版本
  • 02-01 React简介
  • 02-02 其他知识梳理
  • 02-03 其他知识梳理-利用babel把ES5转化为ES6
  • 03-01 React版本选择
  • 03-02 React Starter Pack 下载使用与React初体验
  • 04-01 NodeJS简介
  • 04-02 NodeJS安装
  • 04-03 NPM配置国内源
  • 05-01 使用NPM配置React
  • 05-02 WebPack 热加载配置(上)
  • 05-03 WebPack 热加载配置(中)
  • 05-04 WebPack 热加载配置(下)
  • 05-05 ChromeReact插件使用
  • 06-01 开发工具 Atom
  • 06-02 React开发相关Atom插件配置
  • 07-01 React虚拟DOM概念
  • 07-02 React组件
  • 07-03 React多组件嵌套
  • 07-04 JSX内置表达式
  • 07-05 生命周期
  • 08-01 State属性
  • 08-02 Props属性
  • 08-03 事件与数据的双向绑定
  • 08-04 可复用组件
  • 08-05 组件Refs(操作DOM的二种方法)
  • 08-06 独立组件间共享 Mixins
  • ————— 知识扩展

学习进度

01-01

基础知识目录与相关版本

  • React
  • ES2015
  • WebPack2
  • Atom

02-01

React简介

  • React 是近期非常热门的一个前端开发框架,其本身作为 MVC 中的 View 层可以用来构建 UI,也可以以插件的形式应用到 Web 应用非 UI 部分的构建中,轻松实现与其他 JS 框架的整合,比如 AngularJS。同时,React 通过对虚拟 DOM 中的微操作来实对现实际 DOM 的局部更新,提高性能。其组件的模块化开发提高了代码的可维护性。单向数据流的特点,让每个模块根据数据量自动更新,让开发者可以只专注于数据部分,改善程序的可预测性。
  • Facebook内部用来开发Instagram
  • JavaScript MVC框架
  • 2013年开源React
  • 随后发布React Native
  • React Github React

02-02

其他知识梳理

  • JavaScript
  • ES5/ES6
  • NodeJS
  • HTML
  • CSS
  • 相关知识请看我的博客前端开发基础知识部分科技干货-Blog

02-03

其他知识梳理-利用babel把ES5转化为ES6

  • 安装babel
  • sudo npm install --save-dev babel-cli babel-preset-env
  • ES6语法,因为很多浏览器还不支持ES6所以需要进行转换
  add(items){
    items.map(item => item +1)
  }
  • 在package.json中,通过以下设置来实现转换
{
  ...
  "script":{
    build:"babel index.js --out --file bundel.js"
  }
  ...
}
  • 然后通过执行npm run build,编译成功后就会出现如下,打开bundel.js(命名可自己拟定)
  "use strict"
  add(items)(items.map(function(){
    return item + 1;
  }));

03-01

React版本选择

  • 查看历史版本
  • React历史版本
  • 安装采用NPM的方法npm install react
  • 如果要安装在项目目录下cd react/下面,然后npm install react --save
  • 如果想在电脑全局进行安装则npm install react -g
  • 会自动安装最新的版本,我用的是React 15.5.4

03-02

React Starter Pack 下载使用与React初体验

  • 新版的React没有演示文件,03-02是使用的React 15.3.2
  • 03-02中有一些举例
  • 在examples/basic/下index.html是一个事例可以研究一下,这个地方体现了React在页面上的高性能的优点
var ExampleApplication = React.createClass({
  render: function() {
    var elapsed = Math.round(this.props.elapsed  / 100);
    var seconds = elapsed / 10 + (elapsed % 10 ? '' : '.0' );
    var message =
      'React has been successfully running for ' + seconds + ' seconds.';

    return React.DOM.p(null, message);
  }
});

// Call React.createFactory instead of directly call ExampleApplication({...}) in React.render
var ExampleApplicationFactory = React.createFactory(ExampleApplication);

var start = new Date().getTime();
setInterval(function() {
  ReactDOM.render(
    ExampleApplicationFactory({elapsed: new Date().getTime() - start}),
    document.getElementById('container')
  );
}, 50);

04-01

NodeJS简介

  • Node.js®是一个基于Chrome V8 JavaScript引擎构建的JavaScript运行时。 Node.js使用事件驱动的非阻塞I / O模型,使其轻便且高效。 Node.js的包生态系统,npm,是世界上最大的开源生态系统。
  • NPM命令,NPMJS有强大的库,存放着各种必备的开源文件,日常所需的基本上都能通过它找到,并安装。——NPM.JS

04-02

NodeJS安装

  • 如果想要稳定开发使用 LTS版
  • 如果想要体验NodeJS新功能可以使用 Current版
  • 建议使用 LTS版本,因为Current版本更新会删除之前的功能,使用前值得思考一下!!!!!
  • node -v 检测一下自己Node的版本
  • npm -v 检测一下自己NPM的版本

04-03(可选)

NPM配置国内源

  • 如果你不会翻墙,或者经常NPM装不上东西,可以试一下国内的NPM镜像
  • 这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
  • 方法一,定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm
  • $ npm install -g cnpm --registry=https://registry.npm.taobao.org
  • 方法二,直接通过添加 npm 参数 alias 一个新命令:
alias cnpm="npm --registry=https://registry.npm.taobao.org \
--cache=$HOME/.npm/.cache/cnpm \
--disturl=https://npm.taobao.org/dist \
--userconfig=$HOME/.cnpmrc"

# Or alias it in .bashrc or .zshrc
$ echo '\n#alias for cnpm\nalias cnpm="npm --registry=https://registry.npm.taobao.org \
--cache=$HOME/.npm/.cache/cnpm \
--disturl=https://npm.taobao.org/dist \
--userconfig=$HOME/.cnpmrc"' >> ~/.zshrc && source ~/.zshrc
  • 使用第一种方法taobaoNPM使用的时候写成$ cnpm install [name],就可以安装了!!!
  • 使用第二种方法NPM按照原来的方法$ npm install [name]就可以了!!!
  • 如果想了解更多点击->cnpm

05-01

使用NPM配置React

  • 建立项目后,cd到项目目录,用npm init做项目的初始化,会在目录下产生一个package.json文件
  • 然后开始安装React$ sudo npm install --save react react-dom babelify babel-preset-react
  • 安装完后,项目之下就有了node_modules这个文件夹,这个文件夹存放着以后NPM安装的文件
  • 下一步安装 $ sudo npm install babel-preset-es2015 --save
  • 全部安装完毕后就会是像我这个package.json一样。
  • 以下我使用的版本
{
  "name": "05-01",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "babel-loader": "^7.0.0",
    "babel-preset-react": "^6.24.1",
    "babelify": "^7.3.0",
    "react": "^15.5.4",
    "react-dom": "^15.5.4",
    "webpack": "^2.5.1",
    "webpack-dev-server": "^2.4.5"
  }
}

error01

  • 需要注意的 ---- NPM安装的时候最好$ sudo npm install babel-loader –save很多人无法后面webpack无法打包,就是因为没有安装babel加载器。

05-02

WebPack 热加载配置(上)

  • 创建index.html
<div id="example">123</div>
<script src="bundle.js"></script>
  • (这里会出现一个问题就是关于src中的bundle.js地址的问题,如果是使用src/bundle.js就会出现webpack-server无法更新的情况,我想原因是在与WebPack配置文件中我们定义了文件读取的绝对路径)
  • 在项目目录下建立src文件,用于存放未编译的js与编译好的bundle.js
  • 在src/js/目录下建立一个index.js用于存放未编译的js代码
var React = require('react');
var ReactDOM = require('react-dom');

ReactDOM.render(
  <h1>hello world !!</h1>,
  document.getElementById('example')
);
  • 基本的文档就写好了,下一节是WebPack打包📦

05-03

WebPack 热加载配置(中)

  • 采用WebPack2进行打包
  • WebPack2安装sudo npm install -g webpack
  • WebPack-dev-server安装sudo npm install -g webpack-dev-server
  • 全局安装完后进行项目目录下的安装!!!!(安装的时候最好在前面加上sudo,有时权限不够会安装失败)
$ sudo npm install  webpack --save
$ sudo npm install  webpack-dev-server --save
  • 出现问题可以看React配置必踩坑!!!
  • 在目录文件下建立一个webpack.config.js
  • 很多参考都是采用WebPack1进行打包,对于webpack2更新后的讲解很少
  • 不过还是可以通过官方文档,加上对webpack1的学习,自己还是琢磨出了webpack2如何配置,\(^o^)/~,如下
  • WebPack2配置信息
// webpack.config.js
var webpack = require("webpack");
var path = require("path");

module.exports = {
    devtool: 'source-map',
    context: path.resolve(__dirname, "src"),
    entry: "./js/index.js",
    output: {
        path: path.resolve(__dirname, "src"),
        filename: 'bundle.js' // 打包输出的文件
    },
    module: {
        rules: [{
            test: /\.js$/, // test 去判断是否为.js或.jsx,是的话就是进行es6和jsx的编译
            exclude: /(node_modules)/,
            use: [{
                  loader: 'babel-loader',
                  //配置参数;
                  options: { presets: ['es2015','react'] }
                }],
        }]
    },
};

接下来运行WebPack打包

  • 在Mac终端中,项目的根目录下,webpack进行打包,成功打包后会在src目录下生成bundle.js,在浏览器中查看
  • 原本页面上的123覆盖成了hello world !!

05-04

WebPack 热加载配置(下)

webpack-dev-server的使用

  • 不用每次都去用WebPack一遍
  • webpack -watch自动监听编译,但是需要手动刷新浏览器
  • 如果采用在Mac终端中项目根目录下webpack-dev-server这样可以浏览器中自动刷新,一边写代码,保存后自动刷新。
  • (我发现在webpack2中http://localhost:8080/也可以自动加载不用-hot,不知道是不是自己的原因,有错误,请指出!!!)

05-05

ChromeReact插件使用

  • Chrome react插件 需要进行翻墙安装!!!
  • 另外可以用FireFox进行代替,FireFox不用翻墙也可以安装此插件
  • 测试一下这个工具,src/js/index.js如下:
var React = require('react');
var ReactDOM = require('react-dom');

var ExampleApplication = React.createClass({
  render: function() {
    var elapsed = Math.round(this.props.elapsed  / 100);
    var seconds = elapsed / 10 + (elapsed % 10 ? '' : '.0' );
    var message =
      'React has been successfully running for ' + seconds + ' seconds.';

    return React.DOM.p(null, message);
  }
});

// Call React.createFactory instead of directly call ExampleApplication({...}) in React.render
var ExampleApplicationFactory = React.createFactory(ExampleApplication);

var start = new Date().getTime();
setInterval(function() {
  ReactDOM.render(
    ExampleApplicationFactory({elapsed: new Date().getTime() - start}),
    document.getElementById('example')
  );
}, 50);
  • index.html如下
<div id="example">123</div>
<script src="bundle.js"></script>
  • 具体的效果如下

React-tools

06-01

开发工具 Atom

ATOM

06-02

React开发相关Atom插件配置

  • 在Packages中直接安装,这几个比较不错的插件!!!
  • atom-ternjs
  • atom-beautify
  • open-in-browser
  • emmet
  • file-icons
  • highlight-line
  • highlight-selected

07-01

React虚拟DOM概念

虚拟DOM的结构

  • 在传统的 Web 应用中,我们往往会把数据的变化实时地更新到用户界面中,于是每次数据的微小变动都会引起 DOM 树的重新渲染。如果当前 DOM 结构较为复杂,频繁的操作很可能会引发性能问题。React 为了解决这个问题,引入了虚拟 DOM 技术。

  • 虚拟 DOM 是一个 JavaScript 的树形结构,包含了 React 元素和模块。组件的 DOM 结构就是映射到对应的虚拟 DOM 上,React 通过渲染虚拟 DOM 到浏览器,使得用户界面得以显示。与此同时,React 在虚拟的 DOM 上实现了一个 diff 算法,当要更新组件的时候,会通过 diff 寻找到要变更的 DOM 节点,再把这个修改更新到浏览器实际的 DOM 节点上,所以在 React 中,当页面发生变化时实际上不是真的渲染整个 DOM
  • React 虚拟 DOM 中的诸多如 div 一类的标签与实际 DOM 中的 div 是相互独立的两个概念,它是一个纯粹的 JS 数据结构,它只是提供了一个与 DOM 类似的 Tag 和 API。React 会通过自身的逻辑和算法,转化为真正的 DOM 节点。也正是因为这样的结构,虚拟 DOM 的性能要比原生 DOM 快很多。

07-02

React组件

  • 组件是React的基石,所有的React应用程序都是基于组件的。
  • 之前React组件,使用React.createClass来进行声明
var List = React.createClass({
  getInitialState: function(){
    return['a','b','c']
  },
  render: function(){
    return(...);
  }
});
  • React官方第一时间就支持了ES6 class 的方法,这种写法可读性更强,一个直观的表现就是不用写getInitialState方法了,可以直接在constructor里面定义this.state的值。所以以后代码采用以下格式。
import React from 'react';

class List extends React.components{
  constructor(){
    super();
    this.state = ['a','b','c'];
  }
  render(){
    return(...);
  }
}

  • 这一节里测试一下React的组件
  • 在src/js/下创建文件夹components创建一个header.js
  • header.js如下
import React from 'react';
import ReactDOM from 'react-dom';
export default class CompomentHeader extends React.Component{
  render(){
    return(
      <header>
      <h1>这里是表头</h1>
      </header>
    );
  }
}
  • index.js如下
var React = require('react');
var ReactDOM = require('react-dom');
import CompomentHeader from './components/header';

class Index extends React.Component {
  render() {
    return (
      <div>
      <CompomentHeader/>
      <h1>页面主题内容</h1>
      </div>
    );
  }
}

// 入口
ReactDOM.render( < Index / > , document.getElementById('example'));

HTML标签与React组件

  • React可以直接渲染HTML类型的标签,也可以渲染React的组件
  • HTML类型的标签第一个字母用小写来写表示。
import React from 'react';
//当一个标签里面为空的时候,可以直接使用自闭和标签
//注意class是一个JavaScript保留字,所以如果class应该替换成className
let divElement = <div className="foo"/>;
//等同于
let divElement = React.createElement('div',{className:'foo'});
  • React组件标签第一个字母大写。
import React from 'react';
class Headline extends React.component{
  ...
  render(){
    //直接return JSX语法
    return <h1>Hello React</h1>
  }
}
let Headline = <Headline />;
let headline = React.createElement(Headline);
  • JSX语法使用第一个字母大小写来区分是一个普通的HTML标签还是一个React组件
  • 注意:因为JSX本身是JavaScript语法,所以一些JavaScript中的保留字要用其他的方式书写,比如第一个例子中class要写成className

07-03

React多组件嵌套

  • webpack-dev-server环境运行起来,这里主要是明白了React如何做嵌套
  • src/js/components下创建header.js书写代码✍️
import React from 'react';
import ReactDOM from 'react-dom';
export default class CompomentHeader extends React.Component{
  render(){
    return(
      <header>
      <h1>这里是表头</h1>
      </header>
    )
  }
}
  • src/js/components下创建footer.js书写代码✍️
import React from 'react';
export default class CompomentFooter extends React.Component{
  render(){
    return(
      <footer>
      <h1>这里是尾部</h1>
      </footer>
    );
  }
}

07-04

JSX内置表达式

JSX

  • 在render方法中有一种直接把HTML嵌套在JS中的写法,它被称为JSX。这种写法类似XML,它可以定义HTML一样简洁的树状结构。这种语法结合了JavaScript和HTML的优点(我理解模版化我们编写的程序,这就是React的初衷)既可以像平常一样使用HTML,也可以在里面嵌套JavaScript语法,这种👬友好的格式,让开发者更易于阅读和开发。而且,对于组件来说,直接使用类似HTML的格式,也是非常合理的。但是,需要注意的是。JSX和HTML完全不是一回事,JSX只是作为编译器,把类似HTML的结构编译成JavaScript。
  • JSX的注释是需要特别注意的,采用{/*注释*/}

JSX不是必须的

  • JSX编译器把类似HTML的写法转换成原生的JavaScript方法,并且会将传入的属性转化为对应的对象。它就类似于一种语法糖,把标签类型的写法转换成React提供的一个用来创建 ReactElement 的方法
const MyCompoment;
//input JSX,在JS中直接写成类似HTML的内容,前所未有的感觉,其实它返回的是一个ReactElement
let app = <h1 title="my title"> this is my title </h1>
//JSX转换后的结果
let app = React.createElement('h1',{title: 'my title'},'this is my title');

07-05

生命周期

08-01

State属性

08-02

Props属性

08-03

事件与数据的双向绑定

08-04

可复用组件

08-05

组件Refs(操作DOM的二种方法)

  • 第一种方式
var mySubmitButton = document.getElementById('submitButton');
console.log(mySubmitButton);
ReactDOM.findDOMNode(mySubmitButton).style.color = 'red';
//不推荐此方法,有安全隐患,XSS攻击
  • 第二种方法
console.log(this.refs.submitButton);
this.refs.submitButton.style.color = 'red';

08-06

独立组件间共享 Mixins

知识扩展

About

React知识学习

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages