単純な clojure と同じように、update-in
. まず、Clojure CheatSheet から始めます。
http://jafingerhut.github.io/cheatsheet/clojuredocs/cheatsheet-tiptip-cdocs-summary.html
または ClojureScript バージョン: http://cljs.info
のドキュメントを見てくださいupdate-in
: https://clojuredocs.org/clojure.core/update-in
2 つのコンポーネントが必要です
- ミューテーションのサイトをナビゲートするためのパス
- (1) のポイントを指定して突然変異を実行する関数。
データを完全に指定していません。私はそれが次のように見えると仮定しています:
(def db {:questions [
{:33 {:question "one", :id 33,
:answers [{:id 22, :question_id 33, :answer "one", :correct false}
{:id 4, :question_id 33, :answer "two", :correct false}]}},
{:39 {:question "two", :id 39, :answers []}},
{:41 {:question "three", :id 41,
:answers [{:id 29, :question_id 41, :answer "one", :correct false}
{:id 35, :question_id 41, :answer "two", :correct true}]}}]})
追加する新しいanswer
マップを作成します。
(def new-answer {:id 42, :question_id 442, :answer "The Ultimate", :correct false})
このコードは、プロセスを分割して示しています。
(let [submap (get-in db [:questions 0 :33 :answers])
modified (conj submap new-answer)
final-answer (update-in db [:questions 0 :33 :answers] conj new-answer) ]
最初に取得するナビゲーションsubmap
:
submap =>
[{:id 22, :question_id 33, :answer "one", :correct false}
{:id 4, :question_id 33, :answer "two", :correct false}]
そして、新しい答えを追加する方法:
modified =>
[{:id 22, :question_id 33, :answer "one", :correct false}
{:id 4, :question_id 33, :answer "two", :correct false}
{:id 42, :question_id 442, :answer "The Ultimate", :correct false}]
そして、すべてを 1 つの操作にまとめます。
final-answer =>
{:questions
[{:33
{:question "one",
:id 33,
:answers
[{:id 22, :question_id 33, :answer "one", :correct false}
{:id 4, :question_id 33, :answer "two", :correct false}
{:id 42, :question_id 442, :answer "The Ultimate", :correct false}]}}
{:39 {:question "two", :id 39, :answers []}}
{:41
{:question "three",
:id 41,
:answers
[{:id 29, :question_id 41, :answer "one", :correct false}
{:id 35, :question_id 41, :answer "two", :correct true}]}}]}
これらはすべて、ClojureScript でも Clojure と同じように機能します。
path
インターセプターの使用について心配する必要はありません。役立つというよりも、物事を混乱させると思います。また、次の場合を除き、レンダリング速度について心配する必要はありません。
- あなたはそれが機能し、テストされており、それが正しいことを知っています.
- レンダリング速度を測定し、問題があることと速度を上げる必要があることを文書化できます。
- 長いリストについては
key
、Reagent の各リスト要素に追加できるメタデータを参照してください。参照: Reagent React Clojurescript 警告: seq 内のすべての要素には一意の :key が必要です
アップデート
submap
とは、動作の一部を示すデモンストレーション目的でのみmodified
表示されていることに注意してください。式は、実際にコードに含める唯一のものです。また、 はとのみを使用することに注意してください。update-in
update-in
update-in
db
new-answer