React 快速回顾

React Element

基本用法
  • 表示DOM标签的React元素 => const element = <div />;
  • 表示用户自定义组件的React元素 => const element = <Welcome name="Sara" />;
注意事项
  • React元素是纯对象,创建十分便宜。
  • React元素是不可变的。创建元素后,你不能更改其子元素或属性。
  • 在实践中,大多数React应用程序只调用一次ReactDOM.render()

components

基本用法
  • 组件要先声明,然后才能被引用,且组件以React元素的形式被引用。
  • 组件接受props,并返回表示DOM标签或表示用户自定义组件的React元素,或二者的嵌套。若返回表示用户自定义组件的React元素就意味着对其它组件的引用。
  • 在极少的情况下,你可能希望组件隐藏自身,即使它已由另一个组件渲染。在组件声明中,通过返回null而不是返回渲染输出,即可隐藏组件自身。return null;
  • 组件要么被声明为Functional Components,要么被声明为Class Components,二者只能选其一,后者功能更强大,更常用。
  • 在Class Components的内部使用this.props的形式直接访问props对象中的数据。
注意事项
  • 在声明组件时,始终以大写字母作为组件名的开头。
  • 组件必须返回一个唯一的根元素。

props

基本用法
  • 当React遇到组件引用时,它将JSX属性作为单个对象传递给此组件。我们称这个对象为‘props’。
  • 建议从组件自己的角度来命名prop,而不是它的上下文。
注意事项
  • 不论你是通过函数的方式,还是类的方式声明一个组件,组件绝不能修改自己的props。

state

基本用法
  • 初始化this.state的值 => 只能在类组件的constructor方法体中初始化this.state
  • 更改this.state的值 => 只能通过调用this.setState()方法来更改this.state的值。
  • 引用this.state的值 =>
  • 组件可以将其state当作props向下传递。
  • 根据this.state的值进行条件渲染。
  • this.state的值用作React元素的属性值。属性值会随this.state值的变化而变化。
  • 由于this.propsthis.state可能会被异步更新,因此不应当(以同步编码的方式)依赖它们的值来计算下一个state => 取而代之的是(以异步编码的方式)向this.setState()传递一个函数,该函数接收先前的state作为第一个参数(prevState),接收状态更新时的props作为第二个参数(props)。this.setState((prevState, props) => ({counter: prevState.counter + props.increment }));
注意事项
  • 可以引用this.state的值,但不能为其直接赋值。
  • 如果一些数据没有在render()中使用,那么这些数据就不应该出现在state中。
  • 在React中,可变的状态通常保存在组件的state属性上,并且只能通过setState()方法进行更新。
  • 组件的状态除了拥有和设置它的组件外,其它任何组件都不能访问它。

lifecycle hooks

注意事项
  • 在组件的输出(组件返回的React元素)已被渲染到DOM上后,componentDidMount()运行。
  • 从组件的render方法中返回null,并不会影响组件生命周期方法的触发。例如,componentWillUpdatecomponentDidUpdate依然会被调用。

refs

基本用法
  • (在引用HTML元素时)在HTML元素上使用ref属性 => 将DOM元素引用赋给类属性。ref={input => this.textInput = input}
  • (在引用类组件时)在类组件上使用ref属性 => 将已mounted的组件实例赋给类属性。ref={input => this.textInput = input}
  • (在引用功能组件时)不能在功能组件上使用ref属,但(在功能组件内部引用HTML元素或类组件时)可以在功能组件内部的HTML元素或类组件上使用ref属性 => 将DOM元素引用或已mounted的组件实例赋给局部变量。let textInput = null; ``ref={input => textInput = input; }`
注意事项

ref 回调比componentDidMount更早调用。

React Event

基本用法
  • 为React元素添加事件处理函数:
  • 为DOM元素引用添加事件处理函数 => 事件直接在DOM元素上触发。<button onClick={this.handleClick}> {this.state.isToggleOn ? 'ON' : 'OFF'}</button>
  • 为组件引用添加事件处理函数 => 事件处理函数作为prop传入组件,由组件内部引用的DOM元素或组件触发抑或作为组件的prop继续向下传递。<LogoutButton onClick={this.handleLogoutClick} />; <button onClick={props.onClick}>Logout</button>
  • 在React中你不能通过返回false来阻止默认行为。你必须在事件处理函数中明确调用preventDefault。e.preventDefault();这里的e是合成的事件。React根据W3C规范定义了这些合成事件,所有你不必担心跨浏览器的兼容性。
  • 在React元素开始渲染时为其添加监听程序。
  • 在类的constructor方法体中将事件处理函数中的this绑定到类组件实例。this.handleClick = this.handleClick.bind(this);
注意事项
  • React事件使用camelCase命名,而不是小写命名。
  • 使用JSX传递一个函数作为事件处理程序,不能是一个字符串。

Lists

基本用法
  • 使用数组的遍历方法(如map()forEach(),并为其传入匿名函数)构建元素集,并用花括号{}将元素集include到JSX中。
  • 元素集中的每项既可以是代表DOM标签的React元素,也可以是代表用户自定义组件的React元素。
  • 必须为元素集中的每项添加key属性,属性值为字符串,key属性用于唯一标识每项。
  • Key在React中起着提示的作用,但它们不会被传递给组件。如果你需要在组件中使用相同的值,则使用不同的名称显式地将该值作为props传递。

Form

基本用法
  • 创建受控组件:
  • 通过设置组件的state属性初始化表单元素(如<input type="text">,<textarea>以及<select>)的可变状态。this.state = {value: ''};;<input type="text" value={this.state.value} />
  • 将表单元素实时更新的可变状态同步更新到组件的state属性,并更新UI:
    • handleChange(event) {this.setState({value: event.target.value});}
    • input标签:<input type="text" value={this.state.value} onChange={this.handleChange} />
    • select标签:<select value={this.state.value} onChange={this.handleChange}>
  • 当你需要处理多个受控的input元素,你可以为每个元素添加一个name属性,让处理函数基于event.target.name的属性值来选择后续该做什么。

Lifting State Up

基本用法
  1. 在父组件上设置共享state,子组件上不设置。
  2. 将父组件上的共享state作为prop向下传递给子组件,初始化子组件的状态。
  3. 将父组件中的onChange处理程序作为prop向下传递到子组件对应事件处理程序中并由其调用,并将表单元素实时更新的可变状态作为参数传入,以同步更新父组件中的状态。handleChange(e) {this.props.onChange(e.target.value);}

children

基本用法
  • 在引用组件时,React会将组件开闭标签间的所有内容都作为children prop向下传递。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,041评论 2 35
  • It's a common pattern in React to wrap a component in an ...
    jplyue阅读 3,248评论 0 2
  • 以下内容是我在学习和研究React时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,215评论 2 21
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,809评论 1 18
  • 我曾经爱过你[普希金] 我曾经爱过你爱情 也许在我的心灵里还没有完全消亡但愿它不会再去打扰你我也不想再让你难过悲...
    NG阅读 3,778评论 0 5