Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将初始数据从rails加载到redux_Ruby On Rails_Reactjs_Redux - Fatal编程技术网

Ruby on rails 如何将初始数据从rails加载到redux

Ruby 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返

我尝试从rails加载json,并将其传递给redux createStore

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.如果数据未加载代码,则不能假定数据存在。