我使用Clojurescript re-frame和reagent在react-native应用程序上工作。我有一个文本输入组件,并且有两个版本的代码:
版本1:输入文本是一个独立的组件,状态原子作为参数传递,与reagent库文档和示例中推荐的相同。
问题在于第一个版本在打字时存在性能问题,因为在尝试快速输入时会出现大的延迟和闪烁。版本2没有任何问题,我可以尽可能地快速输入。
根据reagent文档,将r/atom作为参数传递不应该产生任何性能问题。
我在这里做错了什么?避免性能损失的最佳方法是什么?
这只是一个小例子,将一个组件拆分成多个较小的组件是一种良好的实践。此处的状态是局部组件,我不想使用re-frame。
(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没有任何问题,我可以尽可能地快速输入。
根据reagent文档,将r/atom作为参数传递不应该产生任何性能问题。
我在这里做错了什么?避免性能损失的最佳方法是什么?
这只是一个小例子,将一个组件拆分成多个较小的组件是一种良好的实践。此处的状态是局部组件,我不想使用re-frame。
with-let
和form-2版本,但在输入组件中输入文本时仍然出现闪烁问题。 - Marko