我目前有一个videojs组件(与标记)在我的反应应用程序。我想进行反应还原。我试图将这个组件的状态存储在减速器中。但是我想不出正确的方法。她是我的密码。
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方法在这里改变状态。
不能将单个组件切换到Redux。当你说你使用Redux时,这意味着你将它用于整个应用程序。实际上,你可以将Redux用于应用程序的一部分,只是因为你可以将该部分视为单独的模块,但这不是正确的方法。
Redux本身只是一个状态容器。它是独立的,可以在没有React的情况下使用。使Redux与React可用的是一个react-redux
包。我打赌您已经在您的项目依赖项中有它,但如果没有,请执行
$ npm install --save redux react-redux
现在,您需要将该组件连接到Redux工作流。关键词是"连接"。为了做到这一点,在react-redux
包中有一个叫做connect
的函数。进口:
import React, { Component } from 'react';
import { connect } from 'react-redux';
connect
函数最多接受四个参数。要开始使用它,您只需要第一个,一个将状态映射到props的函数。这意味着它在执行时将整个Store传递给它的第一个参数,返回的内容将出现在组件的props中。执行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(...)(...)
)返回一个连接到您的Store的组件。
之后,您仍然可以维护组件自己的状态,但整个目的是将状态管理剥离到您拥有的单个Store。如果组件使用this.setState
更新其状态,要更新Store中的任何值或许多值,您需要调度一个操作。既然您提到您了解Redux的基础知识,我相信您可以自己从这一点开始。好运!