React基础篇(2) -- state&props&refs

内容简介

  • 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>

原文地址:https://www.cnblogs.com/adoctors/p/10186861.html

时间: 2024-10-12 09:20:10

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

从 0 到 1 实现 React 系列 —— 组件和 state|props

看源码一个痛处是会陷进理不顺主干的困局中,本系列文章在实现一个 (x)react 的同时理顺 React 框架的主干内容(JSX/虚拟DOM/组件/...) 项目地址 组件即函数 在上一篇 JSX 和 Virtual DOM 中,解释了 JSX 渲染到界面的过程并实现了相应代码,代码调用如下所示: import React from 'react' import ReactDOM from 'react-dom' const element = ( <div className="titl

react基础篇四

列表 & Keys 渲染多个组件 你可以通过使用{}在JSX内构建一个元素集合 下面,我们使用Javascript中的map()方法遍历numbers数组.对数组中的每个元素返回<li>标签,最后我们得到一个数组listItems 我们把整个listItems插入到ul元素中,然后渲染进DOM: ReactDOM.render( <ul>{listItems}</ul>, document.getElementById('root') ); function N

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

生命周期是react中的重要部分,理解它有助于我们更合理的书写逻辑. 组件的生命周期可分成三个状态: Mounting:已插入真实 DOM Updating:正在被重新渲染 Unmounting:已移出真实 DOM 生命周期的方法有: componentWillMount :在渲染前调用,在客户端也在服务端. componentDidMount : 在第一次渲染后调用,只在客户端.之后组件已经生成了对应的DOM结构. 可以在这个方法中调用setTimeout, setInterval或者发送AJ

react基础:插值 ,Props属性

一:插值插值语法是{},在大括号中可以书写任意的表达式,Js内置的方法,定义 的方法,运算符,语句等等{/*在jsx语法中书写注释一定要写在插值符号中*/} 必须是/**/ 且必须放到{}中eg: 二:Props属性两个相同div,给其中的一个添加一个类,这个div展示的样式就不一样的,因为他具有这个属性就叫class区别于其他的div同理来说对于完全一致的组件,展示完全一致,如果给其中一个添加一些属性,这个组件展示的结果就可以能会不同了,因此react提出组件属性的概念,可以对组件添加一些属性

Hybrid APP基础篇(二)-&gt;Native、Hybrid、React Native、Web App方案的分析比较

说明 Native.Hybrid.React.Web App方案的分析比较 目录 前言 参考来源 前置技术要求 楔子 几种APP开发模式 概述 Native App Web App Hybrid App React Native App 分析 各大开发模式直观对比 如何选择开发模式 另类的app方案 微网页 微信小程序 其它 前言 参考来源 前人栽树,后台乘凉,本文参考了以下来源 对当前主流hybrid app.web app与native app工具的初步比较与分析 H5.React Nati

[译]RxJS 5.X基础篇

欢迎指错与讨论 : ) 当前RxJS版本:5.0.0-beta.10.更详细的内容尽在RxJS官网http://reactivex.io/rxjs/manual/overview.html.文章比较长,可以通过快捷键 command+f 或者 alt+f 搜索主要内容. - 前言  RxJS在ng2.react( mobx ) 中扮演一个重要角色,因此笔者想学好RxJS,提前做好准备.本文95%非原创,而是笔者对RxJS官网基础篇的翻译,如有错漏请指出.本文主要内容:简介和六大概念(Observ

[转] 深入理解React 组件状态(State)

React 的核心思想是组件化的思想,应用由组件搭建而成,而组件中最重要的概念是State(状态),State是一个组件的UI数据模型,是组件渲染时的数据依据. 一. 如何定义State 定义一个合适的State,是正确创建组件的第一步.State必须能代表一个组件UI呈现的完整状态集,即组件的任何UI改变,都可以从State的变化中反映出来:同时,State还必须是代表一个组件UI呈现的最小状态集,即State中的所有状态都是用于反映组件UI的变化,没有任何多余的状态,也不需要通过其他状态计算

React(一):React基础

本文主要是简单说明react基础语法概念和知识,从零开始系列的先绕行官网 组件: JSX语法:在JS里直接编写HTML    return( <div>Hello</div> )  也可以自定义标签,自定义组件首字母需大写 return <MyTag>Hello</MyTag> state:组件的状态,就是数据,更新state,界面可以重新渲染,不需要操作DOM,setState是异步函数 props:state 和 props 主要的区别在于 props 

Vue 基础篇

Vue 基础篇 一.框架与库的区别 JQ库->DOM(DOM操作) + Ajax请求 art-template库->模板引擎 框架 -> 全方位.功能齐全 简易的DOM体验 + 发请求 + 模板引擎 + 路由功能 + ... 代码上的不同: 一般使用库:调用某个函数,自己可以把控库的代码 一般使用框架:其框架在帮我们运行已编写好的代码 框架:初始化自身的一些行为 执行你所编写的代码 施放一些资源 库:小而精 框架:大而全 ( 框架包含了各种库 ) 二.起步 引包 直接用 <scri