将React videojs组件的状态与Redux

时间:2016-10-19 07:56:08

标签: reactjs redux react-redux redux-form

我目前在我的反应应用程序中有一个videojs组件(带标记)。我想转向react-redux。我试图将此组件的状态存储在reducer中。但我无法弄清楚正确的方法。她是我的代码。

import assign from 'object-assign'
import cx from 'classnames'
import blacklist from 'blacklist'
import React, {Component} from 'react'


export default class PlayerLogic extends Component{
    constructor() {
        super();
        this.state = {
            player : {}
        };
    }
    componentDidMount() {
        var self = this;
        var player = videojs(this.refs.video, this.props.options).ready(function () {
            self.player = this;
            self.player.on('play', self.handlePlay);
        });

        if (this.props.onPlayerInit) this.props.onPlayerInit(player);
         player.markers({
            markerStyle: {},
            markers: [
                {length: 8, startTime: 10, endTime: 15, time: 9.5, text: "Cigarette"},
                {length: 2, startTime: 20, endTime: 25, time: 16, text: "Cigarette"},

            ],
            onMarkerReached: function () {
                player.pause();
            },

            next : function() {
                // go to the next marker from current timestamp
                console.log("reached");
                var currentTime = player.currentTime();
                for (var i = 0; i < markersList.length; i++) {
                    var markerTime = setting.markerTip.time(markersList[i]);
                    if (markerTime > currentTime) {
                        player.currentTime(markerTime);
                        break;
                    }
                }
            },


        });

        this.setState({ player: player });
        console.log({player: player});
    }

    next() {
        this.state.player.markers.next();
    }
    prev() {
        this.state.player.markers.prev();
    }

    handlePlay(){
        console.log("handle play ")
    }

    render() {
        var props = blacklist(this.props, 'children', 'className', 'src', 'type', 'onPlay');
        props.className = cx(this.props.className, 'videojs', 'video-js vjs-default-skin', 'vjs-big-play-centered');

        assign(props, {
            ref: 'video',
            controls: true,
            width: "700", height: "450"
        });


        return (
            <div>
                <video {... props}>
                    <source src={this.props.src} type={this.props.type} id={this.props.id}/>
                </video>
                <button onClick={this.next.bind(this)}>next</button>
                <button onClick={this.prev.bind(this)}>prev</button>
            </div>)

    }
}

这是我的纯反应成分。如何切换到react-redux。我知道redux的所有基础知识。我无法找到方法,因为改变状态的代码(player:player)只在componentsDidMount中,我们在这里通过setState方法改变状态。

1 个答案:

答案 0 :(得分:1)

您无法将单个组件切换到Redux。当你说你使用Redux时,这意味着你将它用于整个应用程序。实际上,你可以使用Redux作为你应用程序的一部分,因为你可以将该部分视为一个单独的模块,但这不是正确的方法。

Redux本身只是一个状态容器。它是独立的,可以在没有React的情况下使用。 Redux与React一起使用的原因是react-redux包。我打赌你已经在项目依赖项中拥有它,但如果没有,请执行

$ npm install --save redux react-redux

现在,您需要将该组件连接到Redux工作流程。关键词是&#34; connect&#34;。要做到这一点,connect包中有一个名为react-redux的函数。导入它:

import React, { Component } from 'react';
import { connect } from 'react-redux';

connect function accepts up to four arguments。要开始使用它,你只需要第一个,一个将状态映射到props 的函数。这意味着它是在整个Store传递给它的第一个参数的情况下执行的,并且返回的任何内容都将出现在组件的道具中。执行connect函数的结果是另一个函数,它接受对组件的引用作为引用,因此确保您的组件确实将从该存储接收这些道具。

代码:

export default connect(state => ({
  // here, you pick the properties of state you want to put into the props of PlayerLogic
}))(PlayerLogic);

你可以看到connect(...)(...)语法 - 那是因为再次执行connect(...)会返回一个函数,并且执行该函数(即connect(...)(...))会返回一个组件,即连接到您的商店。

之后你仍然可以维护组件自己的状态,但目的是将状态管理分离到你拥有的单个商店。如果组件使用this.setState更新其状态,更新任何值或商店中的许多值,则需要dispatch an action。既然你提到你了解Redux基础知识,我相信你可以从这一点开始自己动手。祝你好运!