数据源 属性 未从试剂传播到 React Native ListView 组件的呈现方法

The data-source property isn't propagated from reagent to the render method of the React Native ListView component

我正在尝试在试剂中呈现 React Native ListView。

我有以下片段:

(def data-source
 (React.ListView.DataSource. #js{:rowHasChanged (fn [a b] false)}))

(defn render-row []
  [ui/view])

(def rows
  (clj->js ["whoa", "hey"]))

(defn main-scene []
  (fn []
    [ui/list-view {:render-row render-row
                   :data-source (.cloneWithRows data-source rows)}]))

以上导致 "Failed propType: Required prop dataSource was not specified in ListView. Check the render method of app.ios.ui.main_scene." 之后是 "Cannot read property 'rowIdentities' of undefined",因为数据源在 ListView 的渲染方法中未定义。

我的第一个猜测是在 reagent/hiccup 或其他什么的内部某处对 "data-" 属性进行了一些特殊处理,但我找不到任何线索来说明为什么 属性 未正确传播。

而且,是的,(.cloneWithRows data-source rows) 实际上 returns 一个有效的 ListViewDataSource 对象实例。

然后如果我将 :data-source 作为 :dataSource 传递,我得到的只是一个令人费解的 "StaticRenderer.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object."

我正在使用 react-native 0.18.1reagent 0.5.1 以及 re-frame 0.6.0。我用 reagent 0.6.0-alphare-frame 0.7.0-alpha 检查了这个,得到了同样的错误。

我已经研究了好几个小时了,我想我需要一些帮助。任何 hints/ideas 尝试解决这个问题,代码中的任何参考资料要看?提前致谢。

首先,数据源应该作为 :dataSource 而不是 :data-source 传递给视图。后者无论出于何种原因都不起作用。作为旁注,渲染行方法可以作为 :render-row:renderRow 传递,并且它可以双向工作。呵呵

其次,render-row 函数应该 return 一个 React 组件而不是一个数组。如果数组稍后由试剂呈现,后者会没问题,但列表视图不会对从渲染行获取的数据进行任何类型的 post 处理,而只是尝试 return到 React,如果它是一个普通的 clojure 数组就可以了。

所以上面的render-row函数应该写成:

(defn render-row []
  (r/as-element [ui/view]))

然后一切正常。 :)