我在React中製作了一個小的Video
組件(因爲你猜對了,正在播放視頻),我想將該組件嵌入到父組件中,然後能夠調用play
方法視頻組件。ES6 + React組件實例方法
我的視頻組件的樣子:
import React, { Component, PropTypes } from 'react';
import ReactDOM from 'react-dom';
const { string, func } = PropTypes;
export default class Video extends Component {
static propTypes = {
source: string.isRequired,
type: string.isRequired,
className: string
};
play =() => {
};
render =() => {
const { className } = this.props;
return (
<video className={ className } width="0" height="0" preload="metadata">
<source src={ this.props.source } type={ this.type } />
Your browser does not support the video tag.
</video>
);
};
}
它很簡單,沒有什麼特別的事情在這裏。
現在在父組件,讓我們把它叫做Page
:
export default class Page extends Component {
video = (
<Video source="some_url" type="video/mp4" />
);
render =() => {
<div onClick={ this.video.play } />
}
}
但是,如果我登錄.play
這是不確定的。
接下來我想聲明play
作爲道具在Video
並把默認的道具,如:
static defaultProps = {
play:() => {
const node = ReactDOM.findDOMNode(this);
}
}
但在這種情況下,this
不確定的。
在React ES6類上公開一個函數以便它可以被外部組件調用的正確方法是什麼?我應該附加一些東西到Video.prototype
?
是的,我使用Redux和React-Redux來連接組件。因此,最好的方法是將容納視頻的容器組件連接到redux商店,當我想播放視頻時,只需發送一個動作即可。並暫停一個單獨的動作,等等。 – barndog
在我看來,這將是最好的方法。這看起來有點麻煩(對於一個小應用程序,它可能會是這樣),但是當你的應用程序縮放得更大時,它會更乾淨。例如,也許您稍後想要自動暫停視頻以迴應與用戶行爲有些不相關的行爲(例如打開菜單)。你可以通過裁判傳遞方法,但這是混亂和不清楚。派遣一個行動會更好 - 設置它並忘記它。 –
嗯有趣,我喜歡那個流動好多了。然後,視頻組件將只調用由它的父組件定義的道具上的功能,然後可以做他們想做的任何事情,例如執行派遣。並且僅派發一個動作來播放某個視頻並不難。您理論上可以將視頻源存儲在redux存儲中的「currentVideosPlaying」中,然後在連接的組件中對其進行匹配。 – barndog