React学习浅析

写在前面:参考网上学习教程,进行知识点归纳

React 是一个用于构建用户界面的JAVASCRIPT库 ,不是MVC/MVVM结构
React 特点
  • 1.声明式设计 −React采用声明范式,可以轻松描述应用。 直接声明所有dom元素和属性
  • 2.高效 −React通过对DOM的模拟,最大限度地减少与DOM的交互。
  • 3.灵活 −React可以与已知的库或框架很好地配合。
  • 4.JSX − JSX 是 JavaScript 语法的扩展。React 开发不一定使用 JSX ,但我们建议使用它。
  • 5.组件 − 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。
  • 6.单向响应的数据流 − React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单。

MVC/MVVM结构的AngularJs,VueJs等通过双向数据绑定实现DOM操作,开发效率提高,但使用了大量的事件绑定,执行效率下降。
出现ReactJS 使用虚拟DOM(JS表示DOM节点) 兼并开发效率与执行效率

自定义组件
< script src = " https://cdn.bootcss.com/react/15.4.2/react.min.js " ></ script > < script src = " https://cdn.bootcss.com/react/15.4.2/react-dom.min.js " ></ script > < script src = " https://cdn.bootcss.com/babel-standalone/6.22.1/babel.min.js " ></ script >
JSX语法 类似于XML的JavaScript语法
如果我们需要使用 JSX,则 <script> 标签的 type 属性需要设置为 text/babel
  • JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。
  • 它是类型安全的,在编译过程中就能发现错误。
  • 使用 JSX 编写模板更加简单快速。
快速构建项目
$ npm install - g create - react - app$ create - react - app my - app$ cd my - app / $ npm start

ReactDOM.render() //渲染
ReactDOM.render(<h1>aaaaaa</h1>,document.getElementById('foot'));

JavaScript 表达式写在花括号  {}  中

在 JSX 中不能使用  if else  语句,但可以使用  conditional (三元运算)  表达式来替代

React 推荐使用内联样式。我们可以使用  camelCase  语法来设置内联样式. React 会在指定元素数字后自动添加  px  。

注释需要写在花括号中
1、在标签内部的注释需要花括号
2、在标签外的的注释不能使用花括号

JSX 允许在模板中插入数组,数组会自动展开所有成员

React 可以渲染 HTML 标签 (strings) 或 React 组件 (classes)。
要渲染 HTML 标签,只需在 JSX 里使用小写字母的标签名。
要渲染 React 组件,只需创建一个大写字母开头的本地变量 。 React.createClass  方法用于生成一个组件类 
var HelloMessage = React . createClass ({ render : function () { return < h1 > Hello World !</ h1 >; } }) ;
一个组件类必须要实现一个 render 方法, render 渲染
这个 render 方法必须要返回一个 JSX 元素。
必须要用一个外层的 JSX 元素把所有内容包裹起来,返回并列多个 JSX 元素是不合法的.
如果我们需要向组件传递参数,可以使用  this.props  对象
使用 this.props.xx
复合组件
我们可以通过创建多个组件来合成一个组件,即把组件的不同功能点进行分离

注意:
由于 JSX 就是 JavaScript,一些标识符像  class  和  for  不建议作为 XML 属性名。作为替代,React DOM 使用  className  和  htmlFor  来做对应的属性

State Props
getInitialState 方法用于定义初始状态,也就是一个对象,这个对象可以通过 this.state 属性读取。当用户点击组件,导致状态变化,this.setState 方法就修改状态值,每次修改以后,自动调用 this.render 方法,再次渲染组件。
state 和 props 主要的区别在于  props  是不可变的
定义 state 来更新和修改数据。 而子组件只能通过 props 来传递数据
通过 getDefaultProps () 方法为 props 设置默认值
我们可以在父组件中设置 state, 并通过在子组件上使用 props 将其传递到子组件上。
setState 是一个异步方法,需要render执行的时候才会触发
... handleClickOnLikeButton () { this .setState({ count : 0 }) // => this.state.count 还是 undefined this .setState({ count : this .state.count + 1 }) // => undefined + 1 = NaN this .setState({ count : this .state.count + 2 }) // => NaN + 2 = NaN }...
当你调用  setState  的时候, React.js 并不会马上修改 state 。而是把这个对象放到一个更新队列里面,稍后才会从队列当中把新的状态提取出来合并到  state  当中,然后再触发组件更新。:在使用 React.js 的时候,并不需要担心多次进行  setState  会带来性能问题
props
props  的主要作用是让使用该组件的父组件可以传入参数来配置该组件。它是外部传进来的配置参数,组件内部无法控制也无法修改。除非外部组件主动传入新的  props ,否则组件的  props  永远保持不变。
state  是让组件控制自己的状态, props  是让外部对组件自己进行配置
没有  state  的组件叫无状态组件(stateless component),设置了 state 的叫做有状态组件(stateful component)。因为状态会带来管理的复杂性,我们尽量多地写无状态组件,尽量少地写有状态的组件。这样会降低代码维护的难度,也会在一定程度上增强组件的可复用性。前端应用状态管理是一个复杂的问题
当您要聚合来自多个子节点的数据 或 使两个子组件之间相互通信时, 提升 state(状态) ,使其存储在父组件中。父组件可以通过 props(属性) 把 state(状态) 传递回子组件,以使子组件始终与父组件同步。
尽量少地用  state ,尽量多地用  props
函数式组件就是一种只能接受  props 和提供  render  方法的类组件。
如果你在constructor中要使用this.props,就必须给super加参数:super(props);

React. PropTypes 提供很多验证器 (validator) 来验证传入数据是否有效。当向 props 传入无效数据时,JavaScript 控制台会抛出警告

React组件API
  • 设置状态:setState
  • 替换状态:replaceState
  • 设置属性:setProps
  • 替换属性:replaceProps
  • 强制更新:forceUpdate
  • 获取DOM节点:findDOMNode
  • 判断组件挂载状态:isMounted
组件的生命周期可分成三个状态:
  • Mounting:已插入真实 DOM
  • Updating:正在被重新渲染
  • Unmounting:已移出真实 DOM

React.js 控制组件在页面上挂载和删除过程里面几个方法:
  • componentWillMount:组件挂载开始之前,也就是在组件调用 render 方法之前调用。
  • componentDidMount:组件挂载完成以后,也就是 DOM 元素已经插入页面后调用。
  • componentWillUnmount:组件对应的 DOM 元素从页面中删除之前调用。
componentWillMount 用的较少,因为它必须得是同步的; componentDidMount 用的较多,基本上调ajax,改DOM的事情都放这里
-> constructor() -> componentWillMount() -> render() // 然后构造 DOM 元素插入页面 -> componentDidMount() // ...// 即将从页面中删除 -> componentWillUnmount() // 从页面中删除

生命周期的方法有:
  • componentWillMount 在渲染前调用,在客户端也在服务端。在进入状态之前调用
  • componentDidMount : 在第一次渲染后调用,只在客户端。之后组件已经生成了对应的DOM结构,可以通过this.getDOMNode()来进行访问。 如果你想和其他JavaScript框架一起使用,可以在这个方法中调用setTimeout, setInterval或者发送AJAX请求等操作(防止异部操作阻塞UI)。
  • componentWillReceiveProps 在组件接收到一个新的 prop (更新后)时被调用。这个方法在初始化render时不会被调用。
更新阶段的生命周期方法
  • shouldComponentUpdate 返回一个布尔值。在组件接收到新的props或者state时被调用。在初始化时或者使用forceUpdate时不被调用。 
可以在你确认不需要更新组件时使用。
  • componentWillUpdate在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。
  • componentDidUpdate 在组件完成更新后立即调用。在初始化时不会被调用。
  • componentWillUnmount在组件从 DOM 中移除的时候立刻被调用。
react中常用事件
焦点类事件
onFocus //获得焦点时触发onBlur //失去焦点时触发
表单类事件
onChange //内容改变时触发onInput //事件在用户输入时触发onSubmit //提交时触发
键盘类事件
onKeyDown //按下键盘按键时触发onKeyPress //按下键盘按键并松开时触发onKeyUp //放开先前按下的 按键时触发
触摸类事件
onTouchCancel //一般在一些高级事件发生时,触发取消touch事件。例如暂停游戏,存档等。onTouchEnd //移走手指时触发onTouchMove //移动手指时触发onTouchStart //按下手指时触发
用户界面事件
onScroll //元素滚动时执行 JavaScript
滚轮事件
onWheel //事件在鼠标滚轮在元素上下滚动时触发。
剪贴板事件
onCopy //copy元素内容时触发onCut //内容剪切时触发onPaste //粘贴时触发
鼠标类事件
onClickonContextMenuonDoubleClickonDragonDragEndonDragEnteronDragExitonDragLeaveonDragOveronDragStartonDroponMouseDownonMouseEnteronMouseLeaveonMouseMoveonMouseOutonMouseOveronMouseUp

不同的是 React.js 中的  event  对象并不是浏览器提供的,而是它自己内部所构建的。React.js 将浏览器原生的  event  对象封装了一下,对外提供统一的 API 和属性,这样你就不用考虑不同浏览器的兼容性问题。
this
 React.js 调用你所传给它的方法的时候,并不是通过对象方法的方式调用( this.handleClickOnTitle ),而是直接通过函数调用 ( handleClickOnTitle ),所以事件监听函数内并不能通过  this  获取到实例。
bind
bind  会把实例方法绑定到当前实例上,然后我们再把绑定后的函数传给 React.js 的  onClick  事件监听。
bind  不仅可以帮我们把事件监听方法中的  this  绑定到当前组件实例上;还可以帮助我们在在渲染列表元素的时候,把列表元素传入事件监听函数当中

AJAX
React 组件的数据可以通过 componentDidMount 方法中的 Ajax 来获取,当从服务端获取数据时可以将数据存储在 state 中,再用 this.setState 方法重新渲染 UI。
当使用异步加载数据时,在组件卸载前使用 componentWillUnmount 来取消未完成的请求。
同样,如果使用到了定时器,也可以这样使用。先使用componentDidMount来设置延时,再使用 componentWillUnmount 进行取消

表单与事件
父子组件传值 “数据绑定”
onChange  方法将触发 state 的更新并将更新的值传递到子组件的输入框的  value  上来重新渲染界面。
你需要在父组件通过创建事件句柄 ( handleChange ) ,并作为 prop ( updateStateProp ) 传递到你的子组件上。

Refs
Ref  ,你可以用来绑定到 render() 输出的任何组件上。
这个特殊的属性允许你引用 render() 返回的相应的支撑实例( backing instance )。这样就可以确保在任何时间总是拿到正确的实例。


父子组件传值的方式
1.父组件通过state向子组件传值,子组件通过props获取父组件值
2.父组件向子组件传递方法,子组件通过props获取
3.父组件调用子组件中的方法,是使用父组件的refs获取子组件的ref

React处理列表数据
在 React.js 处理列表就是用  map  来处理、渲染的。现在进一步把渲染单独一个用户的结构抽离出来作为一个组件
对于用表达式套数组罗列到页面上的元素,都要为每个元素加上  key  属性,这个  key  必须是每个元素唯一的标识 。一般来说, key  的值可以直接后台数据返回的  id ,因为后台的  id  都是唯一的。 键(Keys) 帮助 React 标识哪个项被修改、添加或者移除了。数组中的每一个元素都应该有一个唯一不变的键(Keys)来标识。一般都是列表的数据需要使用key

当某个状态被多个组件 依赖 或者 影响 的时候,就把该状态提升到这些组件的最近公共父组件中去管理,用  props  传递 数据或者函数 来管理这种 依赖 或着 影响 的行为。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值