Как обновить элемент в векторе в атомном состоянии - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь создать вид списка задач с помощью ClojureScript и инфраструктуры реагентов.Я определил состояние приложения как атом:

(def app-state
  (r/atom
   {:count 3
    :todolist
    [{:id 0 :text "Start learning mindcontrol" :finished true}
     {:id 1 :text "Read a book 'Debugging JS in IE11 without pain'" :finished false}
     {:id 2 :text "Become invisible for a while" :finished false}]}))

Имею функцию для обновления списка задач:

(defn update-todolist [f & args]
  (apply swap! app-state update-in [:todolist] f args))

И функцию переключения todo:

(defn toggle-todo [todo]
  (update-todolist update-in [2] assoc :finished true))

Здесь я 'Я прямо сейчас обновляю векторный элемент по его индексу.

Я рендую каждый элемент с помощью этой функции:

(defn item [todo]
  ^{:key (:id todo)}
  [:div
   [:span {:class "item-text"} (:text todo)]
   [:i {:class (str "ti-check " (if (:finished todo) "checked" "unchecked"))
        :on-click #(toggle-todo (assoc todo :finished true))}]])

Здесь я передаю обновленную задачу, но не всегда правильно передаватьправда.Вероятно, этого будет достаточно, чтобы передать его индекс, и это решит мою проблему, но я понятия не имею, как это сделать.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018
(def app-state
  (r/atom
   {:count 3
    :todolist
    [{:id 0 :text "Start learning mindcontrol" :finished true}
     {:id 1 :text "Read a book 'Debugging JS in IE11 without pain'" :finished false}
     {:id 2 :text "Become invisible for a while" :finished false}]}))


(defn update-todolist [f & args]
  (apply swap! app-state update-in [:todolist] f args))


(defn toggle-todo [todo]
  (swap! app-state update-in [:todolist (:id todo) :finished] not))


(defn item [todo]
  ^{:key (:id todo)}
  [:div
   [:span {:class "item-text"} (:text todo)]
   [:i {:class (str "ti-check " (if (:finished todo) "checked" "unchecked"))
        :on-click #(toggle-todo todo)}]])
0 голосов
/ 06 декабря 2018

Чтобы переключить значение клавиши :finished, просто используйте not:

(swap! app-state update-in [:todolist 2 :finished] not) => 

    {:count 3,
     :todolist
       [{:id 0, :text "Start learning mindcontrol", 
                :finished true}
        {:id 1, :text "Read a book 'Debugging JS in IE11 without pain'",
                :finished false}
        {:id 2, :text "Become invisible for a while", 
                :finished true}]}

Однако это не говорит о том, как индекс 2 соответствует карте с :id 2 внутри него.

...