0

「:questions」というキーワードを使用して、「db」にこの構造 (順序付けられたマップ) があります。

{: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}]}} 

イベントハンドラー「re-frame/reg-event-db」に新しい質問を追加できます。

(assoc-in db [:questions (:id response)] new-map-stuff)

しかし、「:answers」キーにマップを追加する方法がわかりません。その上、新しい回答を追加するたびにすべての質問をレンダリングしているのではないかと心配しています。

「パス」インターセプター (一種の「アップデートイン」) について読みましたが、使用方法の例が見つかりません。

4

1 に答える 1

1

単純な 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. ミューテーションのサイトをナビゲートするためのパス
  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インターセプターの使用について心配する必要はありません。役立つというよりも、物事を混乱させると思います。また、次の場合を除き、レンダリング速度について心配する必要はありません。

  1. あなたはそれが機能し、テストされており、それが正しいことを知っています.
  2. レンダリング速度を測定し、問題があること速度を上げる必要があることを文書化できます。
  3. 長いリストについてはkey、Reagent の各リスト要素に追加できるメタデータを参照してください。参照: Reagent React Clojurescript 警告: seq 内のすべての要素には一意の :key が必要です

アップデート

submapとは、動作の一部を示すデモンストレーション目的でのみmodified表示されていることに注意してください。式は、実際にコードに含める唯一のものです。また、 はとのみを使用することに注意してください。update-inupdate-inupdate-in dbnew-answer

于 2018-10-11T05:34:45.000 に答える