内容简介

  • state
  • props
  • refs
  • 行内样式及动态类名

state

基本介绍

React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。

React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。

初始化状态:

constructor() {
super()
this.state = {
stateName1 : stateValue1,
stateName2 : stateValue2
}
}

读取显示:

this.state.stateName1

更新状态-->更新界面 :

this.setState({stateName1 : newValue})

举例如下:

class Myconponent1 extends React.Component{
constructor(props){
super(props)
// 1、初始化状态
this.state = {
isLike:false
}
//将新增的方法中的this强制绑定为组件对象
this.fun = this.fun.bind(this)
}
//新添加方法:内部this默认undefined
fun(){
//得到原有的状态
let flag = !this.state.isLike
// 3、更新状态(因为是单向数据流,只能通过指定方式改变状态)
this.setState({
isLike:flag
})
}
render(){
// 2、读取状态
const {isLike}=this.state;
return <h1 onClick={this.fun}>{isLike?'you like me?':'i like you!'}</h1>
//可以直接这样写,但效率低 return <h1 onClick={this.fun.bind(this)}>{flag?'you like me?':'i like you!'}</h1>
}
}

理解上面后可简化写法:

class Myconponent1 extends React.Component{
state = {
isLike:false
}
fun=()=>{
let {isLike}=this.state;
this.setState({
isLike:!isLike
})
}
render(){
const {isLike}=this.state;
return <h1 onClick={this.fun}>{isLike?'you like me?':'i like you!'}</h1>
}
}

注意

状态更新可能是异步的,不应该依靠它们的值来计算下一个状态。

可使用第二种形式的 setState() 来接受一个函数而不是一个对象。

该函数将接收先前的状态作为第一个参数,将此次更新被应用时的props做为第二个参数

this.setState((prevState, props) => ({
counter: prevState.counter + props.increment
}));

props

基本介绍

state 和 props 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变。这就是为什么有些容器组件需要定义 state 来更新和修改数据。 而子组件只能通过 props 来传递数据(包括函数方法)。

props是所有组件标签的属性的集合对象。

作用:给标签指定属性, 从目标组件外部向组件内部传递数据(可能是一个function)。

在组件内部读取属性: this.props.propertyName

扩展属性: 将对象的所有属性通过props传递

<Person {...person}/>

默认 Props

你可以通过组件类的 defaultProps 属性为 props 设置默认值,实例如下:

class Hello extends React.Component {
render() {
return (
<h1>Hello, {this.props.name}</h1>
);
}
} Hello.defaultProps = {
name: 'adoctors'
};

Props 验证

Props 验证使用 propTypes,它可以保证我们的应用组件被正确使用,React.PropTypes 提供很多验证器 (validator) 来验证传入数据是否有效。当向 props 传入无效数据时,JavaScript 控制台会抛出警告。

相关链接:http://npm.taobao.org/package/prop-types

子组件响应父组件变化

componentWillReceiveProps(newVal){
console.log("newVal",newVal)
}

举例如下:

function Persion(props){
return (
<ul>
<li>姓名:{props.name}</li>
<li>年龄:{props.age}</li>
<li>性别:{props.sex}</li>
</ul>
)
}
// 默认属性值
Persion.defaultProps={
name:"tom",
age:18,
sex:"男"
}
//对属性值的类型和必要性限制,需要引入新文件
Persion.propTypes={
name:PropTypes.string.isRequired, //string且必须有
age:PropTypes.number //number可以没有
}
let msg={
name:"adoctors",
age:15,
sex:"男"
} ReactDOM.render(<Persion {...msg}/>,document.getElementById(('com')))
//只传name,可以直接写则类型为string,若用{}包裹则可以传成number
ReactDOM.render(<Persion name="jack" age={28} />,document.getElementById(('com1')))

refs

React 支持一种非常特殊的属性 Ref ,你可以用来绑定到 render() 输出的任何组件上。

这个特殊的属性允许你引用 render() 返回的相应的支撑实例( backing instance )。这样就可以确保在任何时间总是拿到正确的实例。

下面是几个适合使用 refs 的情况:

  • 处理焦点、文本选择或媒体控制。
  • 触发强制动画。
  • 集成第三方 DOM 库

如果可以通过声明式实现,则尽量避免使用 refs。

不能在函数式组件上使用 ref 属性,因为它们没有实例。

//指定ref
<div ref="myDiv" style={{color:"red"}}>adoctors</div>
<input type="text" ref="ipt0"/>
<input type="text" ref={val=>this.ipt1=val}/>
<input type="text" onBlur={this.getVal}/> //获取相应的值
getVal=(e)=>{
console.log('获取其他元素的(myDiv)的样式: ',this.refs.myDiv.style.color);
console.log('获取其他元素的(ipt0)值: ',this.refs.ipt0.value)
console.log('获取其他元素的(ipt1)值: ',this.ipt1.value)
console.log('获取本元素的值: ', e.target.value);
}

结果如图:

行内样式

变量控制

let flag={
display:this.props.list.length?'none':'block'
}
<div style={flag}>暂无评论</div>

行内单个样式

<div style={{display: this.props.list.length ? "block" : "none"}}>此标签是否隐藏</div>

行内多个样式

<div style={{display: (index===this.state.currentIndex) ? "block" : "none", color:"red"}}>此标签是否隐藏</div>

动态类名

1、标签中没有其他class,只需要动态添加一个.active的className,来显示内容是否被选中状态,则:

<div className={index===this.state.currentIndex?"active":null}>此标签是否选中</div>

2、如果标签本身有其他class,又要动态添加一个.active的className,来显示内容是否被选中状态,则:

<div className={["container tab", index===this.state.currentIndex?"active":null].join(' ')}>此标签是否选中</div>

注意空格

或者,使用ES6写法(推荐使用ES6写法):

<div className={`container tab ${index===this.state.currentIndex?"active":null}`}>此标签是否选中</div>

React基础篇(2) -- state&props&refs的更多相关文章

  1. React 三大属性state,props,refs以及组件嵌套的应用

    React 三大属性state,props,refs以及组件嵌套的应用 该项目实现了一个简单的表单输入添加列表的内容 代码如下 <!DOCTYPE html> <html> & ...

  2. react基础篇四

    列表 & Keys 渲染多个组件 你可以通过使用{}在JSX内构建一个元素集合 下面,我们使用Javascript中的map()方法遍历numbers数组.对数组中的每个元素返回<li& ...

  3. [react 基础篇]——React.createClass()方法同时创建多个组件类

    react 组件 React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 方法就用于生成一个组件类 一个组 ...

  4. React基础篇 (3)-- 生命周期

    生命周期是react中的重要部分,理解它有助于我们更合理的书写逻辑. 组件的生命周期可分成三个状态: Mounting:已插入真实 DOM Updating:正在被重新渲染 Unmounting:已移 ...

  5. react基础篇六

    创建 Refs 使用 React.createRef() 创建 refs,通过 ref 属性来获得 React 元素.当构造组件时,refs 通常被赋值给实例的一个属性,这样你可以在组件中任意一处使用 ...

  6. react基础篇三

    事件处理 React事件绑定属性的命名采用驼峰式写法,而不是小写. 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM元素的写法) 例如,传统的 HTML: < ...

  7. react基础篇二

    组件 & Props & 生命周期 组件可以将UI切分成一些独立的.可复用的部件,这样你就只需专注于构建每一个单独的部件. 组件从概念上看就像是函数,它可以接收任意的输入值(称之为“p ...

  8. react 基础篇 #2 create-react-app

    1. 介绍 在开发react应用时,应该没有人用传统的方法引入react的源文件(js),然后在html编辑吧. 大家都是用webpack + es6来结合react开发前端应用. 这个时候,我们可以 ...

  9. React基础篇学习

    到今天为止, 使用react已经一年了, 现在整理一下入门时的一些重要知识, 帮助想要学习react的同学们理解某些内容. React 元素 React 元素,它是 React 中最小基本单位,我们可 ...

随机推荐

  1. 聚类 高维聚类 聚类评估标准 EM模型聚类

    高维数据的聚类分析 高维聚类研究方向 高维数据聚类的难点在于: 1.适用于普通集合的聚类算法,在高维数据集合中效率极低 2.由于高维空间的稀疏性以及最近邻特性,高维的空间中基本不存在数据簇. 在高维聚 ...

  2. DRF之解析器组件及序列化组件

    知识点复习回顾一:三元运算 三元运算能够简化我们的代码,  请看如下代码: # 定义两个变量 a = 1 b = 2 # 判断a的真假值,如果为True,则将判断表达式的前面的值赋给c,否则将判断表达 ...

  3. javascript原型继承中的两种方法对比

    在实际的项目中,我们通常都是用构造函数来创建一个对象,再将一些常用的方法添加到其原型对象上.最后要么直接实例化该对象,要么将它作为父类,再申明一个对象,继承该父类. 而在继承的时候有两种常用方式,今天 ...

  4. jQuery使用toggle()方法进行显示隐藏

    转自:https://www.cnblogs.com/sosoft/p/3460556.html 这是一个示例: 1 <html> 2 <head> 3 <script ...

  5. CSS JQuyer 元素选择

    $(this) 当前 HTML 元素 $("p") 所有 <p> 元素 $("p.intro") 所有 class="intro" ...

  6. Oracle11g-BBED安装

    oracle 11g中缺bbed包 下载地址: https://pan.baidu.com/s/19DVvIajarDjnynILNwQDWQ 密码:tmqt 1.BBED的安装 1.上传(sbbdp ...

  7. CImage得到位图的大小

    CImage image; image.Load(_T("1.jpg")); //HBITMAP hBitmap=image.Detach(); HGLOBAL m_hMem = ...

  8. 【280】◀▶ ArcPy 常用工具说明

    目录: 一.相关技巧 二.工具说明 一.相关技巧 技巧1:将工具从工具箱拖拽到 Python 窗体中自动会生成相应的函数,于是可以快速定位函数名称! 技巧2:将通过工具箱实现的操作结果拖拽到 Pyth ...

  9. JanusGraph : 图和图数据库的简介

    JanusGraph:图数据库系统简介 图(graph)是<数据结构>课中第一次接触到的一个概念,它是一种用来描述现实世界中个体和个体之间网络关系的数据结构. 为了在计算机中存储图,< ...

  10. Functions & Closures

    [Functions] 1.不带返回值的函数: 2.通过tuple返回元素 返回的tuple可按如下方式使用: 3.External Parameter: External parameter的使用: ...