まず、私はReact developerを経験していません。ちょうどあなたに知らせてください。私は私のレイアウトのコンポーネントまたは_document.js(私は次を使用してプロバイダ経由店を渡すことができMobX + Reactが私を怒らせる
import {observable, action, reaction, computed, autorun} from 'mobx';
import scrollTo from 'react-scroll-to-component'
クラスActivePostsStore {
@observable _posts = new Map()
@observable _visiblePosts = new Set()
@computed get visiblePosts() {
return this._visiblePosts
}
@action
addPost(uuid, ref) {
// console.log('add post')
this._posts.set(uuid, ref)
}
@action
scrollToPost(uuid) {
// console.log('scroll to post')
scrollTo(this._posts.get(uuid), {})
}
@action
addVisiblePost(uuid) {
console.log('add vis post', this._visiblePosts.values())
this._visiblePosts.add(uuid)
}
@action
removeVisiblePost(uuid) {
console.log('rem vis post', this._visiblePosts.values())
this._visiblePosts = new Set([...this._visiblePosts].filter(el => el !== uuid))
}
// reacts = reaction(() => this._visiblePosts,() => console.log('===='))
// reactToVisiblePosts() {
//
// }
}
const store = new ActivePostsStore()
export default store
私の最初の問題は、:
は、私が店を持っています。 js)。
/*Doesn't work. In root layout*/
<Provider store={ActivePostsStore}>
<Content />
</Provider>
私が使用しようとするたびにProvider
私は自分の店を定義していません。 RootLayoutまたは_document.jsでも。確かに、店舗を利用するコンポーネントのために@observer
注釈を提供しました。しかし、ストアは未定義です。
次に、私は@inject('activePostsStore')
の結果を使用しようとしました。エラーです。それは、まったく店を提供していないようです。しかし、実際には、私はしました。
だから!
@inject(() => ({
store: ActivePostsStore
}))
@observer
最後に、私は(私はそれをログ)visiblePosts
のための要素を追加または削除するためにアクションを使用することができます。私は直接のようにそれを注入することを決めました。しかし!店舗の状態を変更した場合、店舗の小道具はまったく反応しません。たとえば、visiblePostsに新しいエントリを追加することには反応しません。または、ページをリロードすると、定義されていないこともあります。コンポーネントのコードは次のとおりです。
render() {
const {classes} = this.props
return (
<div className={classNames(classes.postsTree)}>
{this.props.store.visiblePosts}
{this.state.groupedDates !== undefined && this.state.groupedDates.map(([date, posts], index) =>
<PostsTreeGroup
active={_.some(posts.map(([uuid]) => uuid), uuid => this.props.store.visiblePosts.has(uuid))}
key={date}
date={date}
posts={posts}/>
)}
</div>
)
}
誰かが私に物事を働かせるように手伝ってください。