组件的数据形式
React 将数据分的更为详细了,分类如下:
- state 【 状态 】
- props 【 属性 】
一、props
props使用来描述组件的性质和特征的,组件不能自己随意去更改 props的定义有两种,分别如下:
- 由外部传入
- 由内部设置
1. 由外部传入
类组件 - 属性外部传入 /* 父组件 */
import React,{ Component } from 'react'
class Father extends Component{
render () {
return (
<div>
<Son name = "西阁"/>
</div>
)
}
}
/* 子组件 */
class Son extends Component{
render () {
return (
<div>
{/* 子组件通过this.props 来接收绑定在它身上的属性 */}
{ this.props.name }
</div>
)
}
}
函数组件 - 属性外部传入
import React from 'react'
/* 父组件 - 通过属性绑定的形式传递数据给子组件 */
const Father = props => {//函数组件可以接收一个props作为参数
const age = 19
return (
<div>
<Son age = { age }/>
</div>
)
}
{/* 子组件 */}
const Son = props => {
return (
<div>
{/* 函数组件 - 通过props参数接收 */}
{ props.age }
</div>
)
}
2. 由内部设置
import React from 'react'
class Hello extends React.Component{
static defaultProps = {
character: '高冷'
}
render () {
return (
<div>
{/* 通过this.props来接收属性 */}
{ this.props.character }
</div>
)
}
}
3. props验证
使用方式如下:
- 当我们接收由外部传入的props时,为了保证我们使用数据的数据类型能过符合我们的要求,那我们需要对接收的数据类型做验证
- props属性验证的方法如下:
- 使用第三方模块 - prop-types
安装
$ yarn add prop-types使用
import React from 'react'
import PropTypes from 'prop-types'
class Father extends React.Component{
render () {
return (
<div>
<Son name = "西阁"/>
</div>
)
}
}
class Son extends React.Component{
render () {
return (
<div>
{ this.props.name }
</div>
)
}
}
Son.propTypes = {
// 验证属性: 验证属性的数据类型
name: PropTypes.string
}
二、state
- state - 状态就是组件描述某种显示情况的数据,由组件自己设置和更改,也就是说由组件自己维护,使用状态的目的就是为了在不同的状态下使组件的显示不同
- state的定义形式有两种,分别如下:
- 直接在类内定义
- 在类的构造器函数之中定义
- 在类内直接定义
import React from 'react' class WestCount extends React.Component{ {/* 类内直接定义 */} state = { count: 0 } render () { // 我们先解构,在使用 const { count } = this.state return ( <div> { count + 1 } </div> ) } } 在类的构造函数中定义
import React from 'react' class WestCount extends React.Component{ {/* 在constructor中定义 */} constructor ( props ) { /* props是指从父组件中传递过来的属性 */ super( props ) // super的作用: this.props = props this.state = { count: 0 } } render () { // 我们先解构,在使用 const { count } = this.state return ( <div> { count + 1 } </div> ) } }状态的修改 - setState
setState的作用: 在React中,setState的作用是用来修改state,state的修改带来的效果就是视图的更新
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
class App extends Component {
constructor() {
super()
this.state = {
name: 'React',
isLiked: false
}
}
handleBtnClick = () => {
this.setState({
isLiked: !this.state.isLiked
})
}
render () {
return (
<div>
<h1>欢迎来到{this.state.name}的世界</h1>
<button onClick={this.handleBtnClick}>
{
this.state.isLiked ? '❤️取消' : '🖤收藏'
}
</button>
</div>
)
}
}
ReactDOM.render(
<App/>,
document.getElementById('root')
)
setState有两个参数
第一个参数可以是对象,也可以是方法 【return一个对象】,我们把这个参数叫做updater
- 参数是对象
this.setState({ isLiked: !this.state.isLiked }) - 参数是方法
注意的是这个方法接收两个参数,第一个是上一次的state, 第二个是propsthis.setState((prevState, props) => { return { isLiked: !prevState.isLiked } })
setState是异步的,所以想要获取到最新的state,没有办法获取,就有了第二个参数,这是一个可选的回调函数
this.setState((prevState, props) => {
return {
isLiked: !prevState.isLiked
}
}, () => {
console.log('回调里的',this.state.isLiked)
})
console.log('setState外部的',this.state.isLiked)