2017-03-09 64 views
1

我想创建一个像这样的是否可以在React中创建一个仍然可以访问全局Redux存储的类?

class Person { 
    constructor(fname, lname) { 
    this.fname = fname; 
    this.lname = lname; 
    } 
} 

,这样我可以正常使用喜欢的一类:

let temp = new Person('John', 'Doe'); 

,但有什么办法,我可以有一个类访问全局存储?

我很乐意做这样的事情:

class Person { 
    constructor() { 
    this.fname = this.props.fname; 
    this.lname = this.props.lname; 
    } 
} 

function mapStateToProps(state) { 
    return { 
    fname: state.person.fname, 
    lname: state.person.lname 
    }; 
} 
export default connect(mapStateToProps)(Person); 

而是因为对于一个阵营组件的构造似乎

constructor(props, context) { 
    super(props, context); 
} 

我理解了它可能不是可能呢?但我想问问,因为它会帮助很多。谢谢

+1

将'this.props'在里面什么'新人'? – Bergi

+0

@Bergi如果我可以使用mapStateToProps连接到Redux商店,那么fname和lname变量将被添加到我的本地道具。添加了“连接”这一行,希望能够更清楚我想要完成什么 – user1189352

回答

1

正常类将不会经历与反应组件相同的生命周期类型,因此connect在这里没有意义。

此外,你真的想避免在多个地方存储相同的状态。 Redux的全部重点是巩固国家,并为您管理。因此,我建议您改为调用store.getState()在需要知道当前fnamelname,而不是试图manange Redux的状态和this.fname之间同步的任何方法,this.lname

要做到这一点,你将不得不暴露当前store通过某种你可能已经在做的import

如果您还没有这样做,我建议使用下面的语法

import { createStore } from 'redux'; 
import rootReducer from '../reducers'; 

export let store = null; // placeholder for store singleton once created 

export function init(initialState = {}){ 
    store = createStore(rootReducer, initialState); 
    return store; 
} 

然后从你的个人类,你可以简单地

import { store } from '../store'; 

function mapStateToProps(state) { 
    return { 
    fname: state.person.fname, 
    lname: state.person.lname 
    }; 
} 

export default class Person() { 
    constructor(){ 
    } 

    toString() { 
     // example method 
     let { fname, lname } = mapStateToProps(store.getState()); 
     return `${fname} ${lname}`; 
    } 
} 
1

不,connect将不适用于这样的普通类。它仅适用于React组件,因为它通过道具或上下文访问商店,并接受/使用React组件。

您需要通过导入直接访问商店对象。有许多其他公用事业,帮助管理商店订阅过程 - 也许其中一个可能会帮助你。请参阅我的清单Redux addons catalog: Store - Store Change Subscriptions

也就是说,最终所有真正做的事情都是在某个时候拨打store.subscribe(),并在其订阅回调中使用store.getState()做些事情。

相关问题