Ruby on rails 如何将初始数据从rails加载到redux
我尝试从rails加载json,并将其传递给redux createStoreRuby on rails 如何将初始数据从rails加载到redux,ruby-on-rails,reactjs,redux,Ruby On Rails,Reactjs,Redux,我尝试从rails加载json,并将其传递给redux createStore let initialStore = window.INITIAL; const createStoreWithMiddleware = applyMiddleware(thunk)(createStore); const store = createStoreWithMiddleware(rootReducer, initialStore); 但我总是得到未定义的,或者只是存储后的window.INITIAL返
let initialStore = window.INITIAL;
const createStoreWithMiddleware = applyMiddleware(thunk)(createStore);
const store = createStoreWithMiddleware(rootReducer, initialStore);
但我总是得到未定义的,或者只是存储后的window.INITIAL返回值
首先,用空对象加载存储,然后调度fetch操作,我用json更新存储,但当我试图调用空对象上的类似{product.title}的东西时,我已经得到了错误。无论我做什么,我都不能在redux开始之前加载json,即使是全局数据,就像这样
(function() {
$.getJSON('http://localhost:3000/products.json', function(data) {
return window.INITIAL = data;
});
});
Api和控制器很简单
def index
products = Product.all
render json: products
end
你是怎么处理的?我想在没有react rails等任何gem的情况下完成此操作,我无法将所有初始状态传递到一个位置的根组件。在上面的问题中,您有以下几点:
let initialStore = window.INITIAL;
const createStoreWithMiddleware = applyMiddleware(thunk)(createStore);
const store = createStoreWithMiddleware(rootReducer, initialStore);
上述代码的问题在于,它只会在您的商店中填充window.INITIAL
,因为它在页面首次加载时就存在。对窗口的任何进一步更改。初始值将被忽略
您需要做的是在服务器呈现的代码中使用初始数据填充window.INITIAL
。也就是说,只需将脚本块放在redux代码之前:
<script>
var INITIAL = { /* this object should match the shape of your reducer state */ };
</script>
var INITIAL={/*此对象应与减速器状态的形状相匹配*/};
就这样。现在去掉AJAX调用。你不需要它。这也会有更高的表现。而不是在页面已经呈现后强制用户等待其他请求,相反,用户可以同时获取页面的其余部分的所有数据。实际上,您需要做的只是在窗口的某个位置添加一个标志。initial
如window.initial.isFetching=true
,然后在获取返回数据时将其更改为false。通过这种方式,您可以查询数据是否已加载,并在加载之前呈现加载图像或其他内容……为什么要尝试从Redux外部将数据传递到Redux?为什么不触发获取初始负载的操作?但是无论如何,如果您的数据是通过网络获取的,那么您也应该有一个“空状态”。浏览器是非阻塞和异步的,因此您必须在数据从服务器返回之前说明请求数据的代码;i、 e.如果数据未加载代码,则不能假定数据存在。