我正在开发一款带有库存系统的游戏。现在,角色装备和库存在我的数据库中是单独的值。我的问题是,当用户装备一个物品时,我需要从库存中删除该物品并将其添加到角色中。
我现在有这样的事情:
(defn equip-item [item idx]
(re-frame/dispatch [:equip-item {:position :off-hand :item item}])
(re-frame/dispatch [:remove-item-from-inventory idx]))
(re-frame/reg-event-db
:equip-item
(fn [db [_ itemObj]]
(update-in db [:character :equipment] merge {(:position itemObj) (:item itemObj)})))
(re-frame/reg-event-db
:remove-item-from-inventory
(fn [db [_ idx]]
(update-in db [:inventory :main] handle-remove idx)))
到目前为止,这工作得很好,但我想知道是否有更好的方法来处理像这样分派多个事件?我知道可以使用
:dispatch-n
键创建效果,但我不确定这在这里是否合适。
无论如何,我也担心一个事件失败而另一个事件成功。它们的行为应该有点像一笔交易,如果其中一个失败,那么它们都应该失败。
最好的方法是提取这些
update-in
来分离常规函数,创建必要的第三个事件,并通过例如调用其中的这些函数->
。当然,您也可以在原始事件中调用这些函数,而不是 update-in
。
不要使用
reg-event-db
,而使用 reg-event-fx
。这将返回效果的哈希值。
这些效果之一可以是
:fx
,它是要调用的其他效果的列表。例如,这些效果可以是调度事件。一些代码:
(rf/reg-event-db
:print1
(fn [db]
(.log js/console "print1!")
db))
(rf/reg-event-db
:print2
(fn [db]
(.log js/console "print2!")
db))
(rf/reg-event-fx
:test-two-dispatch
(fn [{:keys [db]} _]
{:db db
:fx [[:dispatch [:print1]]
[:dispatch [:print2]]]}))