У меня есть приложение для воспроизведения аудио на стороне сервера.
Используя customJapp'jj NextJS , у меня есть постоянный компонент AudioPlayer, в котором я хочу вызвать внутренний *Функция 1005 * всякий раз, когда @observable playerData = {}
изменяется в хранилище mobx.
Я успешно нажимал кнопки на других компонентах в моем обновлении приложения playerData всякий раз, когда это необходимо.
Но я не могу обнаружить этиобновления внутри моего компонента AudioPlayer, чтобы я мог установить его состояние и вызвать this.play(mp3url)
, чтобы начать воспроизведение аудио.
страниц / _app.js
import initializeStore from '../stores/stores';
export default class MyApp extends App {
static async getInitialProps(appContext) {
const mobxStore = initializeStore();
appContext.ctx.mobxStore = mobxStore;
const appProps = await App.getInitialProps(appContext);
return {
...appProps,
initialMobxState: mobxStore,
};
}
constructor(props) {
super(props);
this.mobxStore = props.initialMobxState;
}
render () {
const { Component, pageProps } = this.props
return (
<Provider {...this.mobxStore}>
<Component {...pageProps} />
{ this.mobxStore.playerStore.playerActive && <AudioPlayer /> }
</Provider>
)
}
}
компонентов / AudioPlayer.js
import ReactPlayer from 'react-player'
import { inject, observer } from 'mobx-react'
@inject('playerStore')
@observer
class Player extends Component{
constructor(props) {
super(props)
this.state = {
url: null,
image: null
}
}
componentWillUpdate(nextProps) {
this.setState({
url: nextProps.playerStore.playerData.url,
image: nextProps.playerStore.playerData.image
}, () => { this.play(this.state.url) })
}
// ...Other react-player functions
render() {
<ReactPlayer
{/* ...required props... */}
/>
}
}
Итаккак можно заставить этот постоянный аудиоплеер обнаруживать изменения в mobx, наблюдаемые для воспроизведения звуковых URL-адресов?
На данный момент componentWillReceiveProps
, componentWillUpdate
или componentDidUpdate
не вызывают. componentDidMount
вызывается ровно один раз, как и ожидалось, когда я установил @observable playerActive = true