React 生命周期使用记录

该博客介绍了React组件的生命周期方法,特别是`componentDidMount`、`UNSAFE_componentWillReceiveProps`、`componentWillUnmount`和`componentDidUpdate`。文章以一个名为`PolyvCloudMediaPlayer`的组件为例,展示了如何根据状态加载和卸载视频播放器,并处理保利威视频ID。此外,还讨论了如何加载外部脚本以及在组件状态改变时更新播放器。
import React from 'react';
import { Modal, Button } from 'antd';

/**
 * 注意此组件的调用方式,  通过状态去 装载和卸载
 */
class PolyvCloudMediaPlayer extends React.Component {
	// 构造函数, 组件应用的时候 就会调用
    constructor(props) {
        super(props);
        this.state = {
            isPlayer: false
        }
    }


    
    // 当组件重新挂载的时候 , 如果用法涉及到销毁组件  然后重新渲染  就会走这个
    componentDidMount() {
        console.log('componentDidMount')
        let { record, viewerInfo } = this.props
       
         if (record.vid) {
             this.handelPlayer(record.vid, viewerInfo)
         }
        
    }

    // 注意用法 组件会先渲染到父组件下, 如果存在props参数变更, 就会走这个方法, 之后的版本会移除这个
    UNSAFE_componentWillReceiveProps(nextProps){
        console.log('UNSAFE_componentWillReceiveProps', nextProps)
      
    }

    // 当组件卸载时候,
    componentWillUnmount() {
        console.log('componentWillUnmount')
        if (this.polyvPlayer) {
            this.polyvPlayer.destroy();
        }
    }


    // 只要当前组件内的状态发生改变,state发生了变化。 就会走这个
    componentDidUpdate(){
        console.log('componentDidUpdate', this.props)
    }


    loadScript(src) {
        const headElement = document.head || document.getElementsByTagName('head')[0];
        const _importedScript = {};

        return new Promise((resolve, reject) => {
            if (src in _importedScript) {
                resolve();
                return;
            }
            const script = document.createElement('script');
            script.type = 'text/javascript';
            script.onerror = err => {
                headElement.removeChild(script);
                reject(new URIError(`The Script ${src} is no accessible.`));
            }
            script.onload = () => {
                _importedScript[src] = true;
                resolve();
            }
            headElement.appendChild(script);
            script.src = src;
        })
    }

    loadPlayer() {
        this.polyvPlayer = window.polyvPlayer({
            wrap: '.player',
            width: '100%',
            height: '100%',
            vid: '', // 保利威视频ID
        });
    }

    handelPlayer = (vid, viewerInfo)=>{
        if (!this.state.isPlayer){
        // 注意这里触发了 组件内的state,导致会执行componentDidUpdate
            this.setState({
                isPlayer: true
            })
            this.polyvPlayer = window.polyvPlayer({
                wrap: '.player',
                width: '100%',
                height: '350px',
                vid: vid
                // viewerInfo: viewerInfo && {}
            });
        }
    }

    setModal2Visible(modal2Visible) {
        this.setState({
            isPlayer: false
        })
        if (this.polyvPlayer) {
            this.polyvPlayer.destroy();
        }
        let { handlePlayerModalCancel } = this.props
        handlePlayerModalCancel(modal2Visible)
    }
    render() {
        let { isShowPlayerModal, record, viewerInfo } = this.props
        console.log(isShowPlayerModal)

        return (
            <Modal title="视频" visible={isShowPlayerModal} onCancel={() => this.setModal2Visible(false)} width={850} closable
                bodyStyle={{width: '850px', height: '380px'}}
                footer={[
                    // <Button type="primary" onClick={() => this.handelPlayer(record.vid, viewerInfo)}>
                    //     播放
                    // </Button>
                ]}
                >
                <div className="wrap" style={{ width: '100%', height: '350px'}}>
                    <div className="player"></div>
                </div>
            </Modal>
        )
    }
}

export default PolyvCloudMediaPlayer

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值