个人关于React的一些理解

##React背景

React是当前前端最火的框架,它的理念思想及构建方法比AngularJS更适合做webApp。

它是由facebook团队研发并开源到社区,所以它有很强大的技术背景,而且它的架构方式也很新颖,有很大的发展前景,极有可能是未来前端框架的领头羊,所以我们可以多关注关注React这个框架。

##React的实现

React是一个组件化的开发方式,任何一个组件都可以被替换或者被更改,每个DOM节点都可以当做是一个组件,这个理念和我们常用的模块化有点类似。

而其功能之所以这么强大是因为其前沿的虚拟DOM技术:react会将HTML的整个DOM节点都复制到内存当中,当某个节点被修改或被替换的时候,它会现在内存中找到被修改的节点,对其内存中虚拟出来的节点进行增删改查等功能后再渲染到页面的真实节点上去,这样就避免了整个页面的重新渲染,而且对虚拟节点的操作效率很高,它省去了去页面渲染的过程。

我们常用的框架常常都要和MVC框架作比较,在这里,React只相当于MVC中 的V,即视图部分,它没有模型和控制器,但它可以和其他模型相配合。

React采用----分而治之的思想,但操作起来比angularJs或者ES6的模块化都要难一点,适合作单页应用。

##React的使用

在使用react的时候最少要引入两个JS文件。

--> React.min.js React-Dom.min.js‘

最基本的React操作,如:

ReactDOM.render(

React.createElement(‘h1‘,null,‘Hello Eeact!‘),

document.getElementById(‘content‘)

);

这样开发新节点会显得有点复杂,所以,React又提供了我们一种新的语法,JSX

我们可以通过打包的方式将JSX打包成html代码

我们可以在scrpt标签中定义React的类型:

type = "text/babel"

在向标签中添加类的时候不能写class  只能写className

往标签内写style的时候不能写  style=""  要写成 style ={}

####创建组件

var MyElement = React.createClass({

render:function(){

return <div>

<h1>title</h1>

</div>

}

});

在使用的时候写:

ReactDOM.render(

<myElement></myElement>,

document.getElementById(‘content‘)

);

在JSX的使用中,所有变量的使用都要加一个{}

##React参数的传递

正如我们常会用到值传递一样,React中也有一些值传递的方法:

**如何实现数据传递**:组件与组件之间传递,有两个:props和children,props可以得到当前对象的所有属性和文本属性,而children获取的是开始标签和结尾标签的中间文本,他也是从props里获取的

父组件往子组件传递参数有两种方法:

1、props

用法:现在父组件定义一个属性,然后传给子组件,子组件通过this.props.属性名获取。

2、children

用法:获取开始标签和结束标签中间的内容。

props可以得到属性及children。

而children只能得到开始标签和结束标签中间的内容。

React最难的地方就是数据的传递

##React的redux方法

React中数据传递是单向数据流,每个组件之间交互用state,但state不能传递,由于是单向数据流,所以兄弟之间传递需要通过父级传递,但当组件比较复杂的时候,用这种方法传递就比较混乱

因此React中有个flux模式,他的模式中所有的state放在一个或几个store仓库中,通过dispatch分发来改变store里面的值,如果其他组件绑定store的数据,那么store数据一改,那么组件的数据也会改变,那么所有数据的操作就不会通过state,而是在store里面修改;而**redux就是类似这样流程的工具**,借鉴和改进flux,还可以用在angular和jquery中。

redux的流程:当我们需要操作数据的时候,在调用dispatch之前需要一个action来调用,然后再分发到store里面,store里面有中间键和reducer的函数(负责控制器的作用)来处理将数据存到store,从而改变组件的数据。

store的设计是个难点。

在用redux之前,要先下载:npm install redux,以及下载中间键npm install react-redux

每个action都要写相应的Reducer

const textReducer = function(state = {},action){

//type字符串一般是大写

//这里返回的state是新的state

if (action.type == "ADD_COUT") {

var newState = Objext.assign({},state,{count:action.count});//assign合并两个对象的方法,传3个参数

return newState;

}

}

创建store: createStore(textReducer);

##关于React的交互问题

这里还必须提到一点就是,因为我们使用React就是因为其操作虚拟DOM的方便快捷,所以在使用React的时候要尽量避免对真实节点的操作。

在React中加事件,如,添加一个点击事件:

compute:function(){

if(!this.refs.show.innerHTML){

this.refs.show.innerHTML = 1;

}else {

this.refs.show.innerHTML = parseInt(this.refs.show.innerHTML) + 1;

}

//因为这是操作节点,所以不推荐使用

},

render:function(){

return <div>

<input type = "button" value ="点击" onClick ={this.compute}/>

<span ref="show"></span>

</div>

}

在React中提供了一个属性 状态:state,每一个组件都可以去创建一个他自己的状态,state的特性是无法传递,只能自己使用,别的组件无法使用。

在使用state的时候,需要做以下几步:

1、初始化state

getInitialState:function(){

return {

//这里定义的就是自己的state属性

num:0

}

}

2、操作state

compute:function(){

this.setState({

num:this.state.num + 1

})

}

在节点中添加

<span>{this.state.num}</span>

##React的生命周期

在React中,组件与组件之间调用时,常会使用到一些比较特殊的方法,如需要在组件刚刚加载时就执行某个函数,当某个组件的值发生变化时某个组件的某个方法被立即执行等等,这里,我们就需要用到React的生命周期的方法。

在React中又七种生命周期的方法:

**componentWillMount

**componentDidMount

**componentWillReceiveProps

**shouldComponentUpdate

**componentWillUpdate

**componentDidUpdate

**(PS:还有一个我忘了,希望各位大神补充)

其中:

1、**componentWillReceiveProps,shouldComponentUpdate,componentWillUpdate,componentDidUpdate**:这四个方法在组件刚加载的时候不会立即执行。

2、shouldComponentUpdate在当前组件的属性值或state发生改变的时候会在render之前执行,而且返回的是布尔值,如果不写或为false,会阻止后面的执行;

3、componentWillUpdate是在更新之前执行的;

4、componentDidUpdate是在render后执行;尽量避免在这三个方法中改state;

5、当props改变的情况下才会执行componentWillReceiveProps,但要改变props值就需要设置子组件,在是四个组件里最先执行的;

6、componentWillReceiveProps可以传参数newProps,得到的是新的props

7、shouldComponentUpdate可以传newState和newProps,可以得到新的state和新的props

时间: 2024-12-28 06:43:10

个人关于React的一些理解的相关文章

React 的setState 理解

我们都知道在React中,setState() 方法是用来改变组件状态的,在项目中也一直用,也没有出现什么问题(使用方法太简单了),但今天看了一篇文章,提到了setState 使用时的两个注意点,加深了对setState()的认识. setState() 最简单的使用方式,就是给它传递一个对象,对象中的属性就是我们要改变的状态,对象中只写我们要改变的那些状态就可以了,react 会把我们这次所做的改变和原来没有做改变的状态进行合并,形成最新的状态,重新渲染组件.写一个简单的例子,点击按钮显示点击

React生命周期函数理解

一.组件挂载阶段 1. componentWillMount() 该方法在首次渲染之前调用,在一个组件挂载到卸载的过程中,仅仅执行这一次.该函数内可以state初始化的工作,与constructor的作用类似.这里也是在render方法调用前最后一次修改state的方法. 这里不建议使用Ajax获取接口数据,因为是异步的,所以在接下来的第一次render中根本接收不到响应数据. willMount中setState还是会多一次渲染 2. render() 该方法创建一个虚拟dom,表示组件的输出

react面试题——理解setState(源码object.assign)

setState是异步的方式 this.setState({ counter:this.state.counter+1 }) console.log(this.state.counter) setState是异步,执行最后一个setState 同步执行的方法,传递函数 1,this.setState(nextState=>{ return{ counter: nextState.counter+1 } }) 2,setTimeout(()=>{ this.changeValue() },100

React的设计哲学 - 简单之美

React最初来自Facebook内部的广告系统项目,项目实施过程中前端开发遇到了巨大挑战,代码变得越来越臃肿且混乱不堪,难以维护.于是痛定思痛,他们决定抛开很多所谓的“最佳实践”,重新思考前端界面的构建方式,于是就有了React. React带来了很多开创性的思路来构建前端界面,虽然选择React的最重要原因之一是性能,但是相关技术背后的设计思想更值得我们去思考.之前我也曾写过一篇React的入门文章,并提供了示例代码,大家可以结合参考. 上个月React发布了最新的0.13版,并提供了对ES

React的React Native

React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了React Native,前端的边界似乎广阔无边.而Webpack凭借它异步加载和可分离打包等优秀的特性,走在取代Grunt和Gulp的路上.而面向未来的ES6,模块化的支持似乎已成定局. 我们现在就可以打造自己的Webpack+React+ES6环境并且开始探索起来. 这篇文章就给还没走在这条路上的前端一

react组件渲染的一些想法

最近一直在思考一个问题,react的单向数据流面对深层次组件集合(redux connect方法返回的组件,即一项完整的功能)时,数据该如何传递???redux帮助我们解决了什么问题??? 我使用了redux+react,发现redux并没有解决react组件之间数据传递问题.只是把数据中心化与避免了父组件取子孙组件的数据时那繁琐的回调,却增加了三个麻烦的东西action.reducer.mapStateProps.复杂的处理流程:action里新增一条数据,reducer就需要增加一个对该数据

react随笔

state:数据随着时间变化,用来实现用户交互功能. props:用来实现组件间的通讯(值传递等); -->>从最小应用开始,区分出每个组件的prop和state这两种数据"模型". 分析时,根据提出的三个问题来实现区分: 1.是否是从父级通过 props 传入的?如果是,可能不是 state . 2.是否会随着时间改变?如果不是,可能不是 state . 3.能根据组件中其它 state 数据或者 props 计算出来吗?如果是,就不是 state . -->>

[DAY-01]React

React 一个用于创建可复用,可聚合的web组件的js库 只提供MVC中的V层 WHY 组件化,不是写一堆HTML模板 JS逻辑与HTML标签紧密相连且容易理解 单项数据流   数据一旦更新,则直接重新渲染整个APP 管理UI状态并不简单 修改DOM树 修改数据 接收用户输入 异步API数据请求 和传统的服务器端渲染相似 传统方式 React的渲染方式 浏览器请求页面 用户输入 服务器请求数据库 从API获取数据 将数据传给模板 将数据传给顶层组件 模板渲染页面 React将每个组件渲染出来

推荐大家关注一下这个框架《React.js》

几天前,Facebook在React.js Conf 2015大会上推出了React Native.为什么React Native会引来如此多的关注呢?我在这里谈谈我对React Native的理解. 一个新框架的出现总是为了解决现有的一些问题,那么对于现在的移动开发者来说,到底有哪些问题React Native能涉及呢? 人才稀缺的问题 首先的问题是:移动开发人才的稀缺.看看那些培训班出来的人吧,经过3个月的培训就可以拿到8K甚至上万的工作.在北京稍微有点工作经验的iOS开发,就要求2万一个月