react入门到进阶(二)
一、react属性与事件
1、State属性
State,翻译过来是状态的意思,所以它就代表着组件的状态。React把用户界面(UI)当做是状态机,想象它有不同的状态然后渲染这些状态,可以轻松让用户界面与数据保持一致。而State则代表着组件的一种状态,是可以改变的,一般State的改变都会引起UI的重新渲染,也就是用户界面会随着state变化而变化。
当然,因为前面说过有virtual DOM
的存在,所以State对当前组件做了更新之后,会立马反应到virtual DOM
,这之后才会更新的dom,所以变化的只是很小的一部分,能提高性能(前面有提到过如何提高)。
1、初始化State
我们先看以下例子
import React from 'react';
import ReactDom from 'react-dom';
export default class ComponentHeader extends React.Component{
constructor(){
super();//调用基类所有初始化方法
this.state = {
usename:"chenjunchen"
}
}
render(){
return(
<header>
<p>{this.state.usename}</p>
</header>
)
}
}
从上我们可以看出初始化State,我们一般用构造函数constructor()
来进行,用 super()
函数调用基类方法,值得注意的是,一个类的State是自己独有的,他不会污染其他的,所以对当前类的State进行定义时,只需加上this
就可以了。
2、更改State
当你需要对state做更变的时候,你可以用this.setState
,看一下例子
import React from 'react';
import ReactDom from 'react-dom';
export default class ComponentHeader extends React.Component{
constructor(){
super();//调用基类所有初始化方法
this.state = {
usename:"chenjunchen"
}
}
render(){
setTimeout(()=>{
this.setState({usename:"chen"})},2000);
//更改State
return(
<header>
<p>{this.state.usename}</p>
</header>
)
}
}
这个时候,我们设置了一个定时器等2秒后对state进行变化,而这个时候页面不会整个渲染,而只更改我们要更改的部分,这就符合我们上面说到的。
记住以下几点
- State的作用域只在当前类,不污染其他模块
- 初始化State可以用构造函数
constructor( )
- State对于模块(组件)来说,属于自身属性与Props相对
- State是可变的,而Props则不可以
2、Props属性
如果一个父组件想给另一个子组件传递东西的时候,组件的Props属性就登场了,它与State属性相对应,都是组件重要的属性。
import React from 'react';
import ReactDom from 'react-dom';
class ComponentHeader extends React.Component{
render(){
return(
<header>
<h1>yondu is a good father</h1>
</header>
)
}
}
class Index extends React.Component {
render(){
return(
<ComponentHeader/>
);
}
}
我们可以从上面看出,组件<Index/>
调用了组件<ComponentHeader/>
,我们如果让父组件给子组件传递一个属性的话,直接在父组件中给子组件的标签里添加属性<ComponentHeader userid={123} name="yondu"/>
,而在子组件里,则直接拿来用就可以了
class ComponentHeader extends React.Component{
render(){
return(
<header>
<h1>yondu is a good father</h1>
<p>{this.props.userid} {this.props.name}</p>
</header>
)
}
}
记住以下几点
- Props对于组件来说是自身属性
- Props不能更改
3、事件与数据的双向绑定
上面我们讲了父组件向子组件传递参数,下面来说说子组件向父组件传递参数,由于Props
是不可变的,所以我们可以改变父组件的State
值
我们首先来看一下把父组件中的一个构造函数拿来去接受子组件的参数
import React from 'react';
import ReactDom from 'react-dom';
import BodyChild from './child';
export default class ComponentHeader extends React.Component{
constructor(){
super();
this.state = {
usename:"chenjunchen"
}
}//初始化state
childchange1(event){
this.setState({usename : event.target.value});
}//接受子组件的参数
render(){
return(
<BodyChild childchange={this.childchange1.bind(this)} />
)
}
}
右上可以看出,父组件里childchange1
函数来接受子组件传来的参数,并在给子组件了一个属性childchange
(从标签里可以看出),再来看看子组件
import React from "react";
import ReactDom from "react-dom";
export default class BodyChild extends React.Component {
render(){
return(
<div>
<p>子页面输入<input type="text" onChange={this.props.childchange} /></p>
//当子组件输入框发生变化时,给在父组件的属性childchange传递了一个参数
</div>
)
}
}
可以看出子组件通过props.childchange
给父组件传递了一个参数,并由父组件的构造函数childchange1
接受,然后构造函数再改变父组件State
值,从而达到子组件向父组件传递参数的目的
上面用事件绑定时,我们用的是构造函数来,其实,在React里如果要给一个元素绑定事件,还可以直接调用<input type="button" value="click" onClick={this.changeState.bind(this)} />
,我们就直接给元素绑定了一个click事件
4、可复用组件
上面我们说了在React
中,我们通过props
来实现父组件向子组件传递参数的过程,而有时候如果我们想要规范一下传递的参数时,我们就需要用到propTypes
,如下
ComponentHeader.propTypes = {
userid: PropTypes.number
};//在子组件类定义完了之后,在加上这么一段
而propTypes
后面可跟的参数有很多,比如bool、func、string等,当然如果你必须需要参数的话,你还可以在后面加一个PropTypes.number.isRequired
。
有时候,父组件并没有把参数给子组件,但我们又需要子组件显示那个属性的时候,我们就要用到defaultProps
,来设置一个默认值,看下
const defaultProps ={
name: "默认值",
}
ComponentHeader.defaultProps=defaultProps;
我们先设置了一个常量,然后把这个常量赋值给了defaultProps
,从而达到目的。
如果一个父组件想要给它的孙组件(子组件的子组件)传递参数呢,那么就要用到rest参数了,我们只需要在子组件里的引用孙组件时加入{...this.props}
,这样,父组件的所有属性就都可以传递给孙组件了。
5、组件的Refs
在React中,如果你想要获取原生的html
节点的时候,你就可以用到refs
了。
当然你也可以用以前在javascript中使用的方法,不过太麻烦了,你可以直接给节点加上ID,然后通过document.getElementById
的方式获取到节点后,使用ReactDOM.findDOMNode().style....
的方式来做一些事,而至于refs
的话,先看下例子
<input ref="submitbutton" type="button" value="click" onClick={this.changeState.bind(this)} />
我们直接在节点里面加了refs
属性,然后直接在一个函数里面使用它就可以了。
changeState(){
this.setState({usename:"chen"});
this.refs.submitbutton.style.color="red";
}
refs
需要注意的是:
refs
是访问到组件内部DOM节点唯一可靠方法refs
会自动销毁对子组件的引用- 不要在render或render之前对
refs
进行调用 - 不要滥用
refs
6、独立组件间的共享Mixins
如果有时候,很多个组件都在用同一段代码或者使用同一个功能,那么Mixins
就登场了。Mixins
一般用来存放整个项目共用事件的一些函数的共用属性,我们首先创建一个Mixins.js
的文件,然后在里面写一个函数的属性吧
const Minxins = {
log(){
console.log("hello world");
}
};
export default Minxins//让外部能引用
接着,我们在要使用这个属性的文件引入插件以及我们的Mixins.js
文件
import ReactMixin from 'react-mixin';
import Minxins from './mixins';
然后就是用prototype
赋值,这样我们在上面定义Minxins
属性就可以使用了
changeState(){
Minxins.log();
}//随便找个函数使用这个共有属性
ReactMixin(ComponentHeader.prototype,Minxins);//赋值
值得注意的是,这个Mixins
也有其自己的生命周期。
react入门到进阶(二)的更多相关文章
- react 入门与进阶教程
react 入门与进阶教程 前端学习对于我们来说越来越不友好,特别是随着这几年的发展,入门门槛越来越高,连进阶道路都变成了一场马拉松.在学习过程中,我们面临很多选择,vue与react便是一个两难的选 ...
- react入门到进阶(一)
一.何为react Facebook在F8会议上首次提出这个概念,一套全新的框架就此诞生. React 不是一个完整的 MVC.MVVM 框架,其只负责 View 层 React 跟 Web Comp ...
- react入门到进阶(三)
一.react样式 1.内联样式 在以前写html+css的时候,引入css的时候有一种方法就是内联,而在react中又有些不一样,样式是用变量的形式,如下 const styleComponentH ...
- nodeJS从入门到进阶二(网络部分)
一.网络服务器 1.http状态码 1xx: 表示普通请求,没有特殊含义 2xx:请求成功 200:请求成功 3xx:表示重定向 301 永久重定向 302 临时重定向 303 使用缓存(服务器没有更 ...
- Wireshark入门与进阶系列(二)
摘自http://blog.csdn.net/howeverpf/article/details/40743705 Wireshark入门与进阶系列(二) “君子生非异也,善假于物也”---荀子 本文 ...
- react入门之使用react-bootstrap当轮子造车(二)
react入门之使用react-bootstrap当轮子造车(二) 上一篇我们谈了谈如何配置react的webpack环境 react入门之搭配环境(一) 可能很多人已经打开过官方文档学习了react ...
- React入门教程(二)
前言 距离上次我写 React 入门教程已经快2个月了,年头年尾总是比较忙哈,在React 入门教程(一)我大概介绍了 React 的使用和一些注意事项,这次让我们来继续学习 React 一. Rea ...
- Weex入门与进阶指南
Weex入门与进阶指南 标签: WeexiOSNative 2016-07-08 18:22 59586人阅读 评论(8) 收藏 举报 本文章已收录于: iOS知识库 分类: iOS(87) 职 ...
- react入门(3)
在第一篇文章里我们介绍了jsx.组件.css写法 点击查看react入门(1) 第二篇文章里我们介绍了事件.this.props.children.props....other.map循环 点击查 ...
随机推荐
- linux下如何安装破解IntelliJ IDEA,及其基本使用教程;
今天在linux下安装了IntelliJ idea,由于现在很多企业在linux平台下使用IntelliJ idea做java web的开发,所以对于IntelliJ idea的安装和学习是一件基本的 ...
- 微信开发-微信JSSDK错误:invalid url domain
错误类型:invalid url domain 调试返回参数: { "errMsg": "config:invalid url domain" } 截图: 环境 ...
- admin的基础配置
admin自定义配置 一.admin.py 我们知道在models.py文件中创建的数据表,一方面我们可以通过视图函数对其进行增删改查,一方面我们也可以通过admin进行,通常我们是通过admin的前 ...
- IntelliJ IDEA 2016.2激活
激活码 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lI ...
- 关于python如果没有numpy模块如何处理
1.在python中,你在python的shell输入>>>import numpy 但是编译器告诉你没有numpy库,这时候你就要导入python库,那么如何导入呢 2.收下访问h ...
- C++参数传递(01)
*是取值运算符,对地址使用可以获得地址中储存的数值:对于指针a,*a表示取a中的值 &是地址运算符,对变量使用可以获得该变量的地址. 对于变量b,*b表示取b的地址 别名(引用):主要用于做函 ...
- LeetCode 216. Combination Sum III (组合的和之三)
Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
- 腾讯云VS AWS :云存储网关性能谁更优?
p { text-indent: 2em } 随着企业规模的扩大及业务的扩展,现有IT基础设施特别是存储设备无法满足爆炸性的数据增长,企业 IT 部门为了解决该问题,往往面临市场上多种存储产品及 ...
- 详解 $().css('width')和$().width()的区别
在本次项目开发中,经常用jquery获取高度和宽度并且动态加载,有时候用$().css('width')或$().width()这两个方法获取宽度并设置,但是有时候出现获取不到的情况,查阅资料后发现他 ...
- css基础语法二(常用文本与背景属性)
[CSS常用文本属性] 1. 字体.字号类:① font-weight: 字体粗细. bold-加粗.normal-正常.lighter-细体 也可以使用100-900数值,400表示normal,7 ...