前端攻城狮让前端飞Web前端之路

React学习笔记之基础用法

2018-03-31  本文已影响19人  tiancai啊呆

最近在学习React,并使用React做了一个cnode(欢迎大家给我star、issue,一起学习讨论进步),现就记录一下自己的React学习笔记。

学习资料

React中文文档

环境配置

React的环境配置很麻烦,刚上手时可以使用React脚手架来进行学习。推荐Create React App,或者可以使用我自己写的一个脚手架

Jsx语法

简单来说,就是可以把html和js混在一起写,即html代码里面可以有js代码,js代码里面可以有html。需要注意的是,在html中遇到js代码,需要加花括号,而在js代码中遇到html代码,需要加圆括号。

创建组件

创建组件有两种方式:

function Hello() {
  return <h1>Hello World</h1>;
}
class Hello extends React.Component {
  render() {
    return <h1>Hello World</h1>;
  }
}

不同之处:函数式组件没有state,也不能使用生命周期函数。

注意:组件名称必须以大写字母开头。组件的返回值只能有一个根元素。

props与state
条件加载

React的条件加载和JavaScript中的条件判断一样,我们可以使用条件运算符(?:),与运算符(&&)等来进行条件加载。

循环加载

我们一般按如下的方式进行循环加载

const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
  <li key={number.toString()}>
    {number}
  </li>
)
//一个元素的key最好是这个元素在列表中拥有的一个独一无二的字符串。
//通常,我们使用来自数据的id作为元素的key。当元素没有确定的id时,你可以使用他的序列号索引index作为key
操作表单
class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ''};
    this.handleChange = this.handleChange.bind(this);
  }
  handleChange(event) {
    this.setState({value: event.target.value});
  }
  render() {
    return (
        <div>
          <label>Name:
            <input type="text" value={this.state.value} onChange={this.handleChange} />
          </label>
        </div>
    );
  }
}

一个简单操作表单元素的例子就是这样。但是我们会发现这样操作表单有一些小问题。假如该表单有很多表单元素,那么我们需要为每一个表单元素注册一个change事件的处理函数,这会让组件显得很臃肿。不过不用担心,遇到这种情况我们依然有解决办法。那就是使用ref。

关于Ref

我们可以给DOM元素,类组件添加ref属性,不能给函数式组件添加ref属性。
ref 属性接受一个回调函数,它在组件被加载或卸载时会立即执行。
ref属性也接受一个字符串,(不过未来可能会废弃,推荐使用回调)
ref 在加载时回调接收了底层的DOM元素或已经加载的 React 实例作为参数,在卸载时则会传入 null。

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

  render() {
    return (
        <div>
          <label>Name:
            <input type="text" ref={ input => this.input=input }/>
          </label>
        </div>
    );
  }
}
// 此时this.input指向inputDOM元素,我们可以使用this.input.value得到用户的输入。

除可以操作DOM之外,ref还用于触发强制动画,处理焦点、文本选择或媒体控制等。
不过我们应该尽量避免使用ref。

事件处理
<button onClick={(e) => this.confirm(id, e)}>确定</button>
<button onClick={this.confirm.bind(this, id)}>确定</button>
DOM属性

React实现了一套与浏览器无关的DOM系统,兼顾了性能和跨浏览器的兼容性。
在React中,所有的DOM特性和属性都是小驼峰命名法命名。(aria-和data-属性除外)
一些不同之处:

生命周期

组件的生命周期大致分为三个阶段

  1. 装配阶段(这些方法会在组件实例被创建和插入DOM中时被调用)

    • constructor()
    • componentWillMount()
    • render()
    • componentDidMount()
  2. 更新阶段(属性或状态的改变会触发一次更新。当一个组件在被重渲时,这些方法将会被调用)

    • componentWillReceiveProps(nextProps)
    • shouldComponentUpdate(nextProps, nextState)
    • componentWillUpdate(nextProps, nextState)
    • render()
    • componentDidUpdate(prevProps, prevState)
  3. 卸载阶段(当一个组件被从DOM中移除时,该方法被调用)

    • componentWillUnmount()

除此之外,组件还有一个方法forceUpdate(),调用forceUpdate()将会导致组件的 render()方法被调用,并忽略shouldComponentUpdate()

注意点:

常见问题
  1. 使用React开发必须使用JSX语法吗?
    答:JSX并不是必须的。每一个JSX元素都只是 React.createElement(component, props, ...children)的语法糖。
    因此,任何时候你用JSX语法写的代码也可以用普通的 JavaScript 语法写出来。
  2. 使用React开发必须使用ES6+语法吗?
    答:ES6+并不是必须的。
性能优化

未完待续....

上一篇 下一篇

猜你喜欢

热点阅读