React官网学习笔记

欢迎指导与讨论 : )

  前言

    本文主要是笔者在React英文官网学习时整理的笔记。由于笔者水平有限,如有错误恳请指出 O(∩_∩)O

  一 、Tutoial 篇

    1 . React的组件类名的首字母必须是大写  var Comment = React.creatClass({..})  class Comment extends Component(){...}

    2 . 我们需要往一个对象里传入一些方法,并把这个对象以参数的形式传到React.creatClass( )里。其中最重要的方法是render( ),它会返回一棵组件树,并在最后把组件render(渲染)到HTML里

    3 . 组件内部tags(HTML标签)并不是正真的DOM节点,它们都只是React组件的实例。你可以把这些tags当做是标识,或者是数据的片段,而React会知道怎么处理它们。React也不会生成HTML字符串,因此默认对xss攻击是有保护作用

    4 . 数据通过property(属性)从父级组件传到子组件。在子组件,这些数据成为了this.props,而其它一些嵌套的元素变成了this.props.children

    5 . 当页面出现未经转换的HTML标签,比如 "This is <b>Blog</b>" ,这多半是React未了防止xss攻击而做的。当我们想把字符串里面的标签转换为正真的HTML,我们需要dangerouslySetInnerHTML

 rawMarkup: function() {
    var rawMarkup = ...
    return { __html: rawMarkup };
  }
<span dangerouslySetInnerHTML={this.rawMarkup()} />

    6 . props一般是immutable( 不可变 ),我们需要引入statemutable可变 )。每当state改变时,组件就会re-render( 重新渲染 )它自己。this.state在组件内部是私有的属性,我们可以通过this.setState( )方法来设置、改变state。也能通过getInitialState( )方法来设置初始化的state

    7 . componentDidMount( )方法会在组件渲染在HTML的时候自动执行。因此我们可以在这个生命周期函数里fetch/Ajax异步获取我们需要的数据,然后this.setState,把数据渲染到界面上

    8 . Callbacks as props。父组件把某些函数当做property传给子组件。当子组件触发这个函数时,父组件就能获取变化,并做进一步处理。

  二、Displaying Data / JSX

    1 . React 内部使用迅速、性能强大的虚拟DOM和diffs算法,用来计算‘谁‘是需要被更新的。React 不会随意操作DOM,除非这个操作是必须的。

    2 . 限制:React组件函数最多只允许渲染一个根节点,如果你的组件包含多个节点,请把它们包含在一个大的根节点里面。  

    3 .  JSX语法是可选的,我们也选择使用原生JS去写我们的组件,但是JSX语法更加高效、易懂。JSX可以同时渲染HTML标签(小写)和我们开发的组件(首字母大写)

    4 . 注意:DOM里面的属性class(类名)和for(),在JSX里面的写法是classNamehtmlFor

    5 . 布尔值属性 <input type="button" disabled={false} /> 。三元表达式  var content = <Container>{window.isLoggedIn ? <Nav /> : <Login />}</Container>

    6 . 同名属性会被后面的属性重写

var props = { foo: ‘default‘ };
var component = <Component {...props} foo={‘override‘} />;

    7. 如果我们想为原始的HTML标签增加自定义属性,我们必须为该属性加上前缀 data- 否则React不会为我们渲染这个自定义属性

    

  三、UI / Component / Props

    1 . 函数自动绑定。在es5里,组件内部的方法都会自动绑定到组件实例上。当我们使用es6时,才有必要绑定this

// es6
<div onClick={this.tick.bind(this)}>
// 箭头函数
<div onClick={() => this.tick()}>
// 预绑定
constructor(props) {
    //...
    this.tick = this.tick.bind(this);
}
<div onClick={this.tick}>

    2. 事件代理。React 不会真正地为元素节点创建箭头事件和对应处理函数。当React启动的时候,它会把所有的事件箭头放到单独的一个根节点上面。当有元素插入或者被移除,对应的事件处理函数也会被添加或移除。

    3.   组件就是一个状态机。当我们使用setState的时候,React会根据新的state,非常高效(diff算法)地重新渲染组件

    4. 如何构建一个可复用的组件。( 1 ) Prop validation(类型验证) ( 2 ) Default Props Values(设置默认props值) ( 3 )  由props驱动内部state

   5 . es6语法。( 1 ) 没有自动绑定this ( 2 ) 没有Mixin

 

  四、表单

    1 . 表单组件的某些属性(props)能够通过交互发生改变。value属性( <input><textarea> )、checked( checkbox、radio )、selected( <option> )。同时,当这些表单组件的state或者value改变的时候,也会触发挂载到该组件上的onChange( )事件

    2 . 受限(被控制 controlled component)当表单组件设置了value时(比如<input type=‘text‘ value=‘hello‘ >),就变成了controlled components,你会发现你的输入对表单并没有效果。这是因为React将该组件的value值声明为‘hello‘了。通常的处理是,获取input的React元素(refs、event),并在它上面挂载onChange方法

 getInitialState: function() {
    return {value: ‘Hello!‘};
  },
  handleChange: function(event) {
    this.setState({value: event.target.value});
  },
  render: function() {
    return (
      <input
        type="text"
        value={this.state.value}
        onChange={this.handleChange}
      />
    );
  }

    3 .  Uncontrolled component 不受限的表单控件。<input type=‘text‘/> 向该表单组件进行输入,会立刻从view层得到反应:我们的输入有效了,而不是像上面的例子一样,怎么输入都没有效果。如果要对输入值进行监听,可以设置onChange方法并挂载到该组件上面。同时,我们可以设定默认输入值defaultValue、defaultChecked <input type=‘text‘ defaultValue=‘hello‘ />

    4 . select表单组件

// 单选
<select value="B">
    <option value="A">Apple</option>
    <option value="B">Banana</option>
    <option value="C">Cranberry</option>
 </select>
// 多选
<select multiple={true} value={[‘B‘, ‘C‘]}>.

  五、浏览器环境 / Refs

    1 . Virtual dom( 虚拟dom )。React是很快的,因为它从不直接操作DOM。React在内存中维护一个快速响应的DOM描述符。组件内部的render( )方法也会返回一个DOM的描述符。react通过对比内存中的描述符和组件的描述符,会选择最快的方式更新浏览器的Dom视图。另外,我们在React内部使用的‘事件系统‘,其实全都是React内部的‘虚拟事件‘,React会确保这些事件和事件对象都符合w3c规范,并以一种高性能的方式跨浏览器。

    2 . 组件通常有三种类型的生命周期

      ( 1 ) Mounting(这是一个组件初始化的生命周期)

        1 . getInitialState( ) 一个stateful的组件应该在这个时候声明并返回一个state对象

        2 . componentWillMount( ) 准备插入到Dom

        3 . componentDidMount( ) 已经插入到Dom

      ( 2 ) Updating(这是一个组件re-render重绘它自己的时候所要经历的生命周期)

        1. componentWillReceiviProps( nextProps ) 第一个参数是将接受到一个props的新值

        2 . shouldComponentUpdate(nextProps, nextState) 参数分别是props和state的新值

        3 . componentWillUpdate(nextProps, nextState)同上。在这个生命周期里,我们不能再调用setState

        4 . compoentDidUpdate( preProps, preState  )参数分别是props和state的上一个值

      ( 3 ) Unmounting

        1. componentWillUnmount( ) 当组件被移除前一刻会被执行

    3 .   React.render( )方法会返回一个virtual Dom元素,即组件的"引用" var helloInstannce = ReactDom.render(...) ,当这个组件是stateless的话,会返回null。注意:当我们使用JSX的时候,返回的只是一个ReactElement  var hell = <Hello />

    4 . 通过refs获取组件的实例

<input ref="myInput" />
var input = this.refs.myInput;
var inputValue = input.value;

  

  六、Tips  

    1 . 行内样式。React会为某些具备单位的css属性默认添加 ‘px‘ 单位  var divStyle = {height: 10}; // rendered as "height:10px"

 var divStyle = {
  color: ‘white‘,
  msTransition: ‘all‘
};

ReactDOM.render(<div style={divStyle}>Hello</div>, Node);

    2 . If-else 在JSX中的使用方法

     if-else 在JSX里面是没有效果的,因为JSX仅仅是一些调用函数和构造函数对象的语法糖。对于这个问题,React推荐有两种方法。( 1 ) 调用逻辑和render函数里面的return进行分离 ( 2 ) 在render函数内使用立即执行函数(显然第一种比较好)

// --- 1 ---
var loginButton;
if (loggedIn) {
  loginButton = <LogoutButton />;
} else {
  loginButton = <LoginButton />;
}

return (
  <nav>{loginButton}</nav>
);
// --- 2 ---
return (
  <section>
    <p>
      {(() => {
        switch (this.state.color) {
          case "blue":  return "#0000FF";
          default:      return "#FFFFFF";
        }
      })()}
    </p>
  </section>
);

    3 . 当我们使用  this.props.children 的时候要当心。虽然它大多数情况下会返回一个component数组 ( Array.isArray(this.props.children) => true  但当只有一个component的时候它只会返回一个component,而不是一个Array

    4 . componentDidMount( ) 一个添加Dom监听和初始化拉取数据的好地方

// --- 1 ---
 componentDidMount: function() {
    window.addEventListener(‘resize‘, this.handleResize);
  }
// --- 2 ---
componentDidMount: function() {
    this.serverRequest = $.get(this.props.source, function (result) {
      var lastGist = result[0];
      this.setState({
        username: lastGist.owner.login,
        lastGistUrl: lastGist.html_url
      });
    }.bind(this));
  }, 

  七、插件

    1 . Animation( 动画 ) —— ReactTransitionGroup,这个插件能够让组件在插入或者离开Dom的时候进行一段小动画。 

// 1 . 基本用法
 var ReactCSSTransitionGroup = require(‘react-addons-css-transition-group‘);
// in render function ...
<ReactCSSTransitionGroup transitionName="example" transitionEnterTimeout={500} transitionLeaveTimeout={300}>
          {items}
 </ReactCSSTransitionGroup>
// in style.css
.example-enter {
  opacity: 0.01;
}

.example-enter.example-enter-active {
  opacity: 1;
  transition: opacity 500ms ease-in;
}

.example-leave {
  opacity: 1;
}

.example-leave.example-leave-active {
  opacity: 0.01;
  transition: opacity 300ms ease-in;
}

      ( 2 ) 初始化动画  <ReactCSSTransitionGroup transitionName="example" transitionAppear={true} transitionAppearTimeout={500}>

      ( 3 ) 自定义动画  <ReactCSSTransitionGroup transitionName{{enter:‘enter‘,enterActive:‘enterActive‘,leave:‘leave‘,leaveActive:‘leaveActive‘,appear:‘appear‘,appearActive:‘appearActive‘} }>

       ( 4 ) 禁止动画  transitionEnter={false} or transitionLeave={false}

       ( 5 ) 渲染不同的组件  <ReactTransitionGroup component="ul">

    2 . 双向绑定插件 —— react-addons-linked-state-mixin

var LinkedStateMixin = require(‘react-addons-linked-state-mixin‘);

var WithLink = React.createClass({
  mixins: [LinkedStateMixin],
  getInitialState: function() {
    return {message: ‘Hello!‘};
  },
  render: function() {
    return <input type="text" valueLink={this.linkState(‘message‘)} />;
  }
});

    3 . PureRenderMixin

// es6
import PureRenderMixin from ‘react-addons-pure-render-mixin‘;
class FooComponent extends React.Component {
  constructor(props) {
    super(props);
    this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this);
  }

  render() {
    return <div className={this.props.className}>foo</div>;
  }
}
时间: 2024-10-25 12:56:21

React官网学习笔记的相关文章

官网学习笔记--Advanced Guide

p,pre,span,code,div { font-size: 16px } 一.JSX in Depth 1.1 choosing the type at runtime import React from 'react'; import { PhotoStory, VideoStory } from './stories'; const components = { photo: PhotoStory, video: VideoStory }; function Story(props)

官网学习笔记

*,p,pre,span,div,code { font-size: 16px } 一.Introducint JSX 在JSX中插入用户输入是安全的,默认情况下ReactDOM会在渲染前,转义JSX中的任意值,渲染前,所有的值都被转化为字符串形式,这能预防XSS攻击. 二.Components and Props All React components must act like pure functions with respect to their props. 组件中的props都是只

树莓派官网学习记录

树莓派官网学习记录 和GPIO Zero 一起开始 我们将做的 树莓派一侧的排针是称为通用输入输出引脚(GPIO) 这些引脚允许树莓派去控制现实中的东西.你能连接元件到这些引脚上:输出设备像能任意被开关的LED(发光二极管):或者是输入设备像能用作触发事件的一个按钮或者传感器,比如当一个按钮被按下的时候,点亮一只LED. 通过使用GPIO Zero 库,你能很容易的控制树莓派的GPIO引脚. 我们将学习的 通过完成这个资源你将学到: 如何将LED和按钮连接到树莓派的GPIO上 如何通过GPIO

4.Knockout.Js官网学习(事件绑定)

前言 click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数.大部分是用在button,input和连接a上,但是可以在任意元素上使用. 简单示例 <h2>ClickBind</h2> <div> You've clicked <span data-bind="text: numberOfClicks"></span> times <button data-bind="

Knockout.Js官网学习(系列)

1.Knockout.Js官网学习(简介) 2.Knockout.Js官网学习(监控属性Observables) Knockout.Js官网学习(数组observable) 3.Knockout.Js官网学习(visible绑定) Knockout.Js官网学习(text绑定) Knockout.Js官网学习(html绑定.css绑定) Knockout.Js官网学习(style绑定.attr绑定) 4.Knockout.Js官网学习(click绑定) Knockout.Js官网学习(event

【Spark深入学习 -16】官网学习SparkSQL

----本节内容-------1.概览        1.1 Spark SQL        1.2 DatSets和DataFrame2.动手干活        2.1 契入点:SparkSession        2.2 创建DataFrames        2.3 非强类型结果集操作        2.4 程序化执行SQL查询        2.5 全局临时视图        2.6 创建DataSets        2.7 与RDD交互操作        2.8 聚集函数3.Sp

vagrant 慕课网 学习笔记

搭建一个环境,不需要重复配置,直接利用vagrant复制就可以了 vagrant 和 virtualbox 的版本必须匹配, 不匹配的话可能会出很多未知的错误 搭配问题可以去官网查看 所有源码在 githup.com/apanly/mooc 如果不能FQ 就请访问 git.oschina.net/apanly/mooc 安装git sudo apt-get install git http://www.imooc.com/video/14218 3-5 vagrant ThinkPHP5运行环境

1.Knockout.Js官网学习(简介)

前言 最近一段时间在网上经常看到关于Knockout.js文章,于是自己就到官网看了下,不过是英文的,自己果断搞不来,借用google翻译了一下.然后刚刚发现在建立asp.net mvc4.0的应用程序的时候,建完之后我直接在项目的Scripts中看到了这两个js类库,用谷歌翻译看了下官网,Ko的实现原理是MVVM,比MVC高级一些. 简介MVVM模式 MVVM是Model-View-ViewModel的简写. WPF的数据绑定与Presentation Model相结合是非常好的做法,使得开发

React 官网列子学习

一个有状态的组件 除了接受输入数据(通过 this.props ),组件还可以保持内部状态数据(通过this.state ).当一个组件的状态数据的变化,展现的标记将被重新调用render() 更新. 先看结构,下面是hook函数 hook函数:<br>最早是指windows 系统下提供的一种用来替换DOS 系统下的中断的系统机制:<br>现在则是泛指,在对特定的系统事件进行hook 后,一旦发生已hook 事件,对该事件进行hook 的程序,就会收到系统的通知.这是程序就可以对该