gpt4 book ai didi

clojure - 查询函数在 om.next 中返回值为 nil

转载 作者:行者123 更新时间:2023-12-02 20:58:14 27 4
gpt4 key购买 nike

我目前正在尝试学习om.next

这是我的代码:

(ns hlearn.core
(:require [goog.dom :as gdom]
[om.next :as om :refer-macros [defui]]
[om.dom :as dom]
[sablono.core :as html :refer-macros [html]]))

(enable-console-print!)

(def app-data
(atom {:user ""
:main-menu {:selected :home}}))

;; -------------------------------------------------------------------------
;; Parsing

(defmulti read om/dispatch)

(defmethod read :selected
[{:keys [state]} _ _]
{:value (get-in @state [:main-menu :selected])})

;; -------------------------------------------------------------------------
;; Components

(defui MainMenu
static om/IQuery
(query [this]
[:selected])
Object
(render [this]
(let [{:keys [selected]} (om/props this)]
(println (= selected :home)))))

(def main-menu (om/factory MainMenu))

(defui RootView
Object
(render [this]
(println "Render RootView")
(main-menu)))

(def reconciler
(om/reconciler
{:state app-data
:parser (om/parser {:read read})}))

(om/add-root! reconciler
RootView (gdom/getElement "app"))

我的目标是组件 MainMenu 必须在控制台上写入 true(当前写入 false)。

由于读取函数应返回 {:value :home} (应用程序状态上的值),因此 (= selected :home) 应该为 true。

实际上,MainMenu 在控制台上写入 false,因为 selected 的值为 nil

最佳答案

事实证明,在 (om/add-root!) 上呈现的 RootView 组件必须为所有应用程序提供查询。

在这种情况下,RootView 还必须提供查询,并将 selected 键传递给 MainMenu 组件。

(def app-data
(atom {:user ""
:menu {:selected :home}}))

(defui RootView
static om/IQuery
(query [this]
`[{:menu (om/get-query MainMenu)}])
Object
(render [this]
(let [{:keys [menu]} (om/props this)]
(println "Render RootView")
(main-menu menu))))

此外,阅读器函数在 :menu 键上调度,而不是 :selected 键。

(defmethod read :menu
[{:keys [state]} _ _]
{:value (get-in @state [:menu])})

其余代码保持不变。

关于clojure - 查询函数在 om.next 中返回值为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34646528/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com