关于Mobx inject传值问题?

发布于 2022-09-07 08:48:26 字数 2666 浏览 14 评论 0

按照文档正常配置了Mobx,在子组件中想通过inject的形式获取和调用参数,但是出现了undefined问题?

// index.ts
ReactDOM.render(
    <Provider timerStore={TimerStore}>
        <div>
            <App/>
            <DevTools />
        </div>
    </Provider>,
    document.getElementById('root') as HTMLElement
);
// App.ts
interface IProps {
  timerStore?: TimerStore;
}

interface IState {
    timer: number;
}

@inject('timerStore')
@observer
class App extends React.Component<IProps, IState> {
    constructor(props: IProps) {
        super(props);

    const { timer } = this.props.timerStore as TimerStore;
    console.log(timer);
    
        this.state = {
            timer
        };
  }

    public render() {
        return (
            <div className="App">
                <header className="App-header">
                    <img src={logo} className="App-logo" alt="logo" />
                    <h1 className="App-title">Welcome to React</h1>
                </header>
                <p className="App-intro">
                    To get started, edit <code>src/App.tsx</code> and save to reload.
                </p>
                <Main name="hello wrold" />
        <Timer/>
                <TimerLess timer={this.state.timer} />
            </div>
        );
    }
}

export default App;
// TimerStore.ts
import { observable, action } from "mobx";

export class TimerStore {
  @observable public timer = 1;

  @action.bound
  public add() {
    this.timer += this.timer;
  }

  @action.bound
  public reset() {
    this.timer = 0;
  }
}

export default new TimerStore();
// Timer.ts
interface IProps {
  timerStore?: TimerStore;
}

interface State {}

inject('timerStore')
@observer
export default class Timer extends React.Component<IProps, State> {
  constructor(props: IProps) {
    super(props);
    this.state = {};

    this.onClickBtn = this.onClickBtn.bind(this)
  }

  public onClickBtn():void {
    const tStore = this.props.timerStore as TimerStore;
    console.log(tStore);   // undefined
  }

  public render() {
    const tStore = this.props.timerStore as TimerStore;
    console.log(tStore); // undefined

    return (
      <div onClick={this.onClickBtn}>Seconds passed: {1}</div>
    )
  }
}

App.ts中,我们可以正常的获取数据,但是在子组件Timer.ts,通过inject的方式注入store时,获取相应的store,会是undefined,查了好多原因,都不知道问题出了哪里??求搭建帮忙解决一下?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

ι不睡觉的鱼゛ 2022-09-14 08:48:26

这个问题我答不上来,想另外请教一下题主关于注入时ts报错的问题
如下图 我若是在interface里声明 并配置可选属性 那么就会出现下图这种报错, 但我若是不配置可选只是声明,父组件就会报错说我没传wallData这个props让我给他props,但是这个本来就不是父组件传的啊。。。。
clipboard.png
clipboard.png

迷鸟归林 2022-09-14 08:48:26

babel配置文件需要安装‘babel-plugin-transform-decorators-legacy’、'babel-preset-stage-1',两款插件
可能是由于修饰器@dec是es7最新语法 需要解析

み青杉依旧 2022-09-14 08:48:26

试下Provider的下一层div添加属性timerStore={TimerStore}, 我是这样能行的,感觉这样就变成了父子组件传输

丶视觉 2022-09-14 08:48:26

你的子组件Timer.ts 里面的inject少了个@符号吧!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文