美文网首页
第六节:React组件:状态提升与条件渲染

第六节:React组件:状态提升与条件渲染

作者: 时光如剑 | 来源:发表于2020-06-08 11:17 被阅读0次

1. 状态提升

1.1 状态提升说明
  1. 目前为止,已经了解了每个组件都有自己的状态state,通过setState修改状态触发渲染
  2. 也了解了父组件可以通过props将数据传递给子组件
  3. props属性不仅可以传递普通的数据,还是传递函数, 这样就可以在子组件中执行父组件中的函数
  4. 并且在父组件函数中修改父组件自己的数据
  5. 那么非父子组件如何传递参数呢,这个时候就需要用到状态提升
  6. 将兄弟组件都需要用到的状态存放在共同的父组件中,这就是状态提升

2.状态提升图

2.1 组件维护组件自己的状态

说明:

  1. 每个组件都有自己的状态

  2. 组件难以去修改别的组件的状态,

  3. 图中如果想点击button按钮改变主题颜色,也就是TitleButton两个组件颜色都改变

  4. 如果TitleButton组件都维护自己组件的状态state就不太好传递数据

组件图:

状态提升.png
2. 2. 将状态提升到共同的父组件中
  1. 状态提升就是将状态提升到共同的父组件中
  2. 父组件在通过props下发state状态数据给每一个子组件使用
  3. 父组件通过props下发一个父组件APP的方法给Button子组件
  4. 这样Button子组件就可以通过父组件传递过来的方法修改父组件的状态
  5. 父组件状态一变,就会触发重新渲染, 每一个子组件都将获取最新的数据进行渲染
状态提升2.png
2.3. 示例代码

组件状态提升与方法下发的示例代码:


// 创建组件
// title组件
class Title extends React.Component{
    constructor(){
        super()
    }


    render(){

        let {color} = this.props
        return (
            <h3 style={{color: color}}>这是一个标题</h3>
        )
    }
}

// Button 组件
class Button extends React.Component{
    constructor(props){
        super(props)
    }

    render(){
        let {color,handleClick} = this.props

        return (
            <div>
                <button
                    style={{color:color}}
                    type="button"
                    onClick={() => {
                        handleClick("blue")
                    }}
                    >
                    蓝色主题
                </button>
                <button
                    style={{color:color}}
                    type="button"
                    onClick={() => {
                        handleClick("green")
                    }}
                    >
                    绿色主题
                </button>
            </div>
        )
    }
}


// APP 组件
class App extends React.Component{
    constructor(){
        super()
        this.state = {
            themeColor: 'blue'
        }
    }

    handleClick(color){
        console.log(this)
        this.setState({
            themeColor: color
        })
    }


    render(){
        let {themeColor} = this.state

        return (
            <div>
                <Title color={themeColor}/>
                <Button 
                    handleClick={(color) => this.handleClick(color)} 
                    color={themeColor}/>
            </div>
        )
    }
}

// 渲染组件
ReactDOM.render(<App /> , document.getElementById(('root')))

3. React条件渲染

跟JavaScript一样,通过条件运算符来判断是否显示不同的组件

3.1 条件渲染说明:
  1. 在JSX语法中{}内部是JavaScript表达式
  2. 因此就可以在{}中使用JavaScript中的条件运算符来判断是否显示某个组件
  3. 比较常用的是三目运算符
3.2 render函数中判断

说明:

  1. 每次组件状态的改变都会触发render函数的重新执行
  2. 因此我们可以在render函数中,通过if条件判断,返回不同的组件,保存在变量中
  3. 在return的JSX语法中使用这个变量来表示组件, 这样切换组件的显示

示例代码如下:


// 添加内容组件
function ShowA(){
    return <h2>This is ShowA Component</h2>
}

function ShowB(){
    return <h2>This is ShowB Component</h2>
}

// 渲染组件
class App extends React.Component{
    constructor(){
        super()

        this.state = {
            isShowA : true
        }
    }

    render(){
        let {isShowA } = this.state;
        
        // 定义保存组件的变量
        let showComponent = null
        
        // 更加条件的不同,变量中赋值不同的组件
        if(isShowA){
            showComponent =  <ShowA />
        }else{
            showComponent =  <ShowB />
        }
        
        // 也可以简写如下
        // showComponent = isShowA ? <ShowA /> : <ShowB />

        return (
            <div>
                {/* 显示代表不同组件的变量 */ }
                { showComponent }
                <button 
                    type="button" 
                    onClick={() => this.setState({isShowA: !isShowA})}
                >点击显示组件{isShowA? "B" : "A"}</button>
            </div>
        )
    }
}


// 将组件渲染到页面上
ReactDOM.render(<App /> ,document.getElementById("root"))
3.3. JSX语法中判断如何显示组件

说明:

  1. 在JSX语法中{}中为JS表达式
  2. 因此可以在这表达式中直接通过三目运算符判断如何显示组件

示例代码

// 添加内容组件
function ShowA(){
    return <h2>This is ShowA Component</h2>
}

function ShowB(){
    return <h2>This is ShowB Component</h2>
}

// 渲染组件
class App extends React.Component{
    constructor(){
        super()

        this.state = {
            isShowA : true
        }
    }

    render(){
        let {isShowA } = this.state;

        return (
            <div>
                {/* 在JSX中判断如何显示组件 */}
                {isShowA ? <ShowA />: <ShowB />}
                <button 
                    type="button" 
                    onClick={() => this.setState({isShowA: !isShowA})}
                >点击显示组件{isShowA? "B" : "A"}</button>
            </div>
        )
    }
}


// 将组件渲染到页面上
ReactDOM.render(<App /> ,document.getElementById("root"))
3.4 render函数中判断和JSX中判断有何不同
  1. 在JSX中{}内部不能使用if..else处理逻辑判断
  2. 因此render函数中if判断中就可以在判断以后处理比较复杂的逻辑,
  3. 如果是三目判断, 两者没有区别

相关文章

  • 第六节:React组件:状态提升与条件渲染

    1. 状态提升 1.1 状态提升说明 目前为止,已经了解了每个组件都有自己的状态state,通过setState修...

  • 第六节:React组件:状态提升与条件渲染

    1. 状态提升 1.1 状态提升说明 目前为止,已经了解了每个组件都有自己的状态state,通过setState修...

  • ReactJS_07 React 条件渲染

    React 条件渲染 在 React 中,你可以创建不同的组件来封装各种你需要的行为。然后还可以根据应用的状态变化...

  • react随笔6 条件渲染

    条件渲染 在React中你可以创建不同的组件封装需要的行为,然后可以根据应用的状态变化只渲染其中的一部分组件。Re...

  • React概念

    React 的核心思想是:封装组件。各个组件维护自己的状态和 UI,当状态变更,自动重新渲染整个组件。 React...

  • React入门教程(5)条件渲染及列表渲染

    条件渲染 在 React 中,你可以创建不同的组件来封装各种你需要的行为。然后还可以根据应用的状态变化只渲染其中的...

  • 前端-React

    React 知识 React 的核心思想是:封装组件。各个组件维护自己的状态和 UI,当状态变更,自动重新渲染整个...

  • React基础(4) -- State状态

    React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI...

  • ReactJS_04 React State(状态)

    React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI...

  • React State(状态)

    React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI...

网友评论

      本文标题:第六节:React组件:状态提升与条件渲染

      本文链接:https://www.haomeiwen.com/subject/kbrltktx.html