在相关商店的页面中使用多个 React 应用程序

Using multiple react apps in page with relevant stores

我在 React 中有一个评论应用程序:

require('console-polyfill')
import 'babel-polyfill'
import React from 'react'
import ReactDOM from "react-dom"
import App from "./app/app.js"
import { makeid } from "shared/services/helpers.js"
import { Provider } from "react-redux"
import store from "./app/services/store.js"
require('./app/scss/main.scss')

window.R_loadReactComment = function(element){
    new ReactDOM.render(<Provider store={store}><App /></Provider>, element);
}

在模板文件中,我可以像这样在调用时呈现此应用程序:

$(function(){
        if($(".ordered_react_comment").length){
            var elements = document.getElementsByClassName("ordered_react_comment");
            for (var x = 0; x < elements.length; x++)
                window.R_loadReactComment(elements[x]);
        }
    })

它按预期呈现,但是当我单击按钮以显示评论应用程序时,此评论应用程序的所有反应实例都会显示!我猜最有可能的原因是因为他们都在共享和改变同一个商店。我不希望这种情况发生,我希望每个 React 应用程序都有自己的商店。我怎样才能让每个应用程序都有自己的商店(如果这是这里的问题)。

JavaScript 模块是单例。您可以阅读更多内容 here

Modules are singletons. Even if a module is imported multiple times, only a single “instance” of it exists.

因此 import store from "./app/services/store.js" 每次都给你相同的商店。

为避免这种情况,导入一个创建商店实例的函数,并将一个实例传递给您的提供商。

目前举个例子,你的店铺大概是这样的

// create store

export default store;

你需要将这个包装在函数中,return那个函数。

function getNewStore() {
  // create store
  return store
}

export default getNewStore;

现在您每次都可以使用这个功能来创建一个新的商店实例。

import getNewStore from "./app/services/store.js"

//...

window.R_loadReactComment = function(element){
    const store = getNewStore();
    new ReactDOM.render(<Provider store={store}><App /></Provider>, element);
}