Sui Move 前端共学笔记(六)-Context

74 阅读1分钟

HOH水分子社区,是一个专注于编程、教育和创新的社区。

需求

使用服务调用者模式完成笔记四需求。

Context模式

image.png

如图所示,Provider在范围内提供服务,调用者在服务提供范围内获取服务。

核心代码

const GlobalContext=React.createContext()

创建上下文,用于定义服务和调用者。

<GlobalContext.Provider service={提供的服务}>
       {组件代码}
</ GlobalContext.Provider>
<GlobalContext.Consumer>
    {(value)=>{调用者组件代码}}
</GlobalContext.Consumer>

定义供应商,和消费者,消费者代码部分必须使用回调函数。

需求实现代码

import React, {Component} from 'react';
import axios  from "axios";
import "../css/film_state_up.css"


const GlobalContext=React.createContext()
// 创建上下文


class APP extends Component {
    constructor() {
        super();
        this.state={
            filmList:[],
            filmDetail:""
        }
        axios.get("/test.json").then(
            res => {
                console.log(res.data.data.films);
                this.setState({filmList:res.data.data.films});
            }
        )
    }
    // 组件初始化

    render() {
        return (
            <GlobalContext.Provider value={
                {filmDetail:this.state.filmDetail, changeDetail:(value)=>{this.setState({filmDetail:value})}
                }}>
                // 定义provider,提供获取状态filmDetail和修改状态filmDetail的服务。
                <div>
                    {this.state.filmList.map(item=>
                        <FilmList key={item.filmId} {...item}></FilmList>
                    )}

                    <FilmDetail/>
                </div>
            </GlobalContext.Provider>
        );
    }
}

class FilmList extends Component{
    render() {
        let {name,poster,grade,synopsis }=this.props
        return (
            <GlobalContext.Consumer>
            // 定义调用者
                {
                    (value)=>{
                        return (
                            <div className={"filmItem"} onClick={() => {
                                console.log(synopsis);
                                value.changeDetail(synopsis);
                                // 调用者调用修改filmDetail状态的服务。
                            }}>
                                <img src={poster} alt={name}/>
                                <h4>{name}</h4>
                                <div>观众评分:{grade}</div>
                            </div>
                        )
                    }
                }
            </GlobalContext.Consumer>
        )
    }
}

class FilmDetail extends Component {
    render() {
        return (
            <GlobalContext.Consumer>
            // 定义调用者
                {
                    (value)=>
                        <div className={"filmDetail"}>
                            {value.filmDetail}
                            // 调用者调用获取filmDetail状态的服务。
                        </div>
                }
            </GlobalContext.Consumer>
        )
    }
}

export default APP;

在该模式中,电影组件与电影概述组件,同为消费者,首页组件作为服务提供者,提供修改电影概述和获取电影概述的服务,当用户点击电影列表时,电影组件调用setState修改filmDetail的值,此时因为filmDetail状态被修改,首页组件重新渲染,电影概述组件调用获取filmDetail服务显示电影概述内容,效果同笔记(四)。

HOH水分子公众号 Alya @HOH Jane @HOH