00、react.js之 用法心得
来源:互联网 发布:linux snmptrap接收 编辑:程序博客网 时间:2024/06/16 02:44
1、setState高级用法
详细说明连接:http://huziketang.com/books/react/lesson10
setState 接受对象参数
setState 接受函数参数
这里还有要注意的是,当你调用 setState
的时候,React.js 并不会马上修改 state。而是把这个对象放到一个更新队列里面,稍后才会从队列当中把新的状态提取出来合并到 state
当中,然后再触发组件更新。这一点要好好注意。可以体会一下下面的代码:
... handleClickOnLikeButton () { console.log(this.state.isLiked) this.setState({ isLiked: !this.state.isLiked }) console.log(this.state.isLiked) }...
你会发现两次打印的都是 false
,即使我们中间已经 setState
过一次了。这并不是什么 bug,只是 React.js 的 setState
把你的传进来的状态缓存起来,稍后才会帮你更新到 state
上,所以你获取到的还是原来的 isLiked
。
所以如果你想在 setState
之后使用新的 state
来做后续运算就做不到了,例如:
... 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 }...
上面的代码的运行结果并不能达到我们的预期,我们希望 count
运行结果是 3
,可是最后得到的是 NaN
。但是这种后续操作依赖前一个 setState
的结果的情况并不罕见。
这里就自然地引出了 setState
的第二种使用方式,可以接受一个函数作为参数。React.js 会把上一个 setState
的结果传入这个函数,你就可以使用该结果进行运算、操作,然后返回一个对象作为更新 state
的对象:
... handleClickOnLikeButton () { this.setState((prevState) => { return { count: 0 } }) this.setState((prevState) => { return { count: prevState.count + 1 } // 上一个 setState 的返回是 count 为 0,当前返回 1 }) this.setState((prevState) => { return { count: prevState.count + 2 } // 上一个 setState 的返回是 count 为 1,当前返回 3 }) // 最后的结果是 this.state.count 为 3 }...
这样就可以达到上述的利用上一次 setState
结果进行运算的效果。
2、state与props说明
state 的主要作用是用于组件保存、控制、修改自己的可变状态。state 在组件内部初始化,可以被组件自身修改,而外部不能访问也不能修改。你可以认为 state 是一个局部的、只能被组件自身控制的数据源。state 中状态可以通过 this.setState 方法进行更新,setState 会导致组件的重新渲染。
props 的主要作用是让使用该组件的父组件可以传入参数来配置该组件。它是外部传进来的配置参数,组件内部无法控制也无法修改。除非外部组件主动传入新的 props,否则组件的 props 永远保持不变。
state 和 props 有着千丝万缕的关系。它们都可以决定组件的行为和显示形态。一个组件的 state 中的数据可以通过 props 传给子组件,一个组件可以使用外部传入的 props 来初始化自己的 state。但是它们的职责其实非常明晰分明:state 是让组件控制自己的状态,props 是让外部对组件自己进行配置。
如果你觉得还是搞不清 state 和 props 的使用场景,那么请记住一个简单的规则:尽量少地用 state,尽量多地用 props。
没有 state 的组件叫无状态组件(stateless component),设置了 state 的叫做有状态组件(stateful component)。因为状态会带来管理的复杂性,我们尽量多地写无状态组件,尽量少地写有状态的组件。这样会降低代码维护的难度,也会在一定程度上增强组件的可复用性。
3、组件的两种常用写法
React.js 非常鼓励无状态组件,在 0.14 版本引入了函数式组件——一种定义不能使用state
组件,例如一个原来这样写的组件:
class HelloWorld extends Component { constructor() { super() } sayHi () { alert('Hello World') } render () { return ( <div onClick={this.sayHi.bind(this)}>Hello World</div> ) }}
用函数式组件的编写方式就是:
const HelloWorld = (props) => { const sayHi = (event) => alert('Hello World') return ( <div onClick={sayHi}>Hello World</div> )}
以前一个组件是通过继承 Component
来构建,一个子类就是一个组件。而用函数式的组件编写方式是一个函数就是一个组件,你可以和以前一样通过 <HellWorld />
使用该组件。不同的是,函数式组件只能接受 props
而无法像跟类组件一样可以在constructor
里面初始化 state
。你可以理解函数式组件就是一种只能接受 props
和提供 render
方法的类组件。
4、渲染列表数据
对于用表达式套数组罗列到页面上的元素,都要为每个元素加上 key 属性,这个 key 必须是每个元素唯一的标识。一般来说,key 的值可以直接后台数据返回的 id,因为后台的 id 都是唯一的。
详细说明链接:http://huziketang.com/books/react/lesson13
5、页面数据初始化说明
我们一般会把组件的 state 的初始化工作放在 constructor 里面去做;在 componentWillMount 进行组件的启动工作,例如 Ajax 数据拉取、定时器的启动;组件从页面上销毁的时候,有时候需要一些数据的清理,例如定时器的清理,就会放在 componentWillUnmount 里面去做。
6、props.children 和容器类组件
详细链接:http://huziketang.com/books/react/lesson22
使用自定义组件的时候,可以在其中嵌套 JSX 结构。嵌套的结构在组件内部都可以通过 props.children 获取到,这种组件编写方式在编写容器类型的组件当中非常有用。而在实际的 React.js 项目当中,我们几乎每天都需要用这种方式来编写组件。
7、组件的命名和方法的摆放顺序
8、使用循环时的性能优化
9、React性能优化
- 00、react.js之 用法心得
- 00、js用法心得
- React 实践心得:react-redux 之 connect 方法详解
- React Native系列之-React.js介绍
- React Native系列之-React.js入门
- React之ref详细用法
- React之ref详细用法
- React.js 之筛选篇
- lcx用法之心得总结
- react(4.0)之react-redux入门及基本用法
- React Native之FlexBox布局上的一些心得
- react + redux + react-redux 心得
- React Native学习之TabBarIOS用法
- React动画API之ReactTransitionGroup用法
- React.js学习之环境搭建
- React之动画表现(CSS3 JS rAF)
- React.js之组件通信(基础)
- React-Native 之index.ios.js解读
- CSU
- 数据结构笔记
- JOSN传递对象数据类型的原理
- D
- java浮点运算的陷阱
- 00、react.js之 用法心得
- 素数距离问题
- 用ASP.NET Web API技术开发HTTP接口(二)
- 编程常用缩写
- hightCharts 跳转页面接改为弹窗图形设置效果!
- java自学-数组
- 一维数组,字符数组,字符串,二维数组在sizeof()和strlen()下的不同输出
- RecyclerView添加Header和Footer
- SYN攻击的基本原理、工具及检测方法