我使用 Clojurescript re-frame 和试剂处理本机应用程序。我有一个文本输入组件,并且有两个版本的代码:
版本 1:输入文本是一个单独的组件,状态原子作为参数传递,与试剂库文档和示例中推荐的相同。
(defn todo-input [value]
[rn/text-input
{:style (styles :textInput) :multiline true
:placeholder "What do you want to do today?" :placeholder-text-color "#abbabb"
:value @value
:on-change-text #(reset! value %)}]
)
(defn todo-screen []
(let [value (r/atom nil)]
[rn/view {:style (styles :container)}
[rn/text {:style (styles :header)} "Todo List"]
[rn/view {:style (styles :textInputContainer)}
[todo-input value]
[rn/touchable-opacity
{:on-press (fn [] (rf/dispatch [:add-todo @value]) (reset! value nil))}
[icon {:name "plus" :size 30 :color "blue" :style {:margin-left 15}}]]]
[todos]
]))
版本 2:一个组件中的所有内容。
(defn todo-screen []
(let [value (r/atom nil)]
[rn/view {:style (styles :container)}
[rn/text {:style (styles :header)} "Todo List"]
[rn/view {:style (styles :textInputContainer)}
[rn/text-input
{:style (styles :textInput) :multiline true
:placeholder "What do you want to do today?" :placeholder-text-color "#abbabb"
:value @value
:on-change-text #(reset! value %)}]
[rn/touchable-opacity
{:on-press (fn [] (rf/dispatch [:add-todo @value]) (reset! value nil))}
[icon {:name "plus" :size 30 :color "blue" :style {:margin-left 15}}]
]]
[todos]]))
问题是第一个版本在打字时存在性能问题,因为在尝试快速打字时会有很大的延迟和闪烁。版本 2 没有任何问题,我可以尽可能快地打字。
根据试剂文档,将 r/atom 作为参数传递不应引起任何性能问题。
我在这里做错了吗?在这里避免性能损失的最佳方法是什么。
这是一个小例子,使用一个组件而不是两个组件并不是什么大问题,但是在良好的实践中将一个大组件拆分为多个较小的组件。这里的状态是组件本地的,我不想为它使用 re-frame。