浏览代码

refactor chat example data structure

Evan You 9 年之前
父节点
当前提交
c67b18ec67
共有 3 个文件被更改,包括 33 次插入22 次删除
  1. 5 1
      examples/chat/components/MessageSection.vue
  2. 18 13
      examples/chat/vuex/index.js
  3. 10 8
      examples/chat/vuex/mutations.js

+ 5 - 1
examples/chat/components/MessageSection.vue

@@ -3,7 +3,7 @@
     <h3 class="message-thread-heading">{{ thread.name }}</h3>
     <h3 class="message-thread-heading">{{ thread.name }}</h3>
     <ul class="message-list" v-el:list>
     <ul class="message-list" v-el:list>
       <message
       <message
-        v-for="message in thread.messages | orderBy 'timestamp'"
+        v-for="message in messages | orderBy 'timestamp'"
         track-by="id"
         track-by="id"
         :message="message">
         :message="message">
       </message>
       </message>
@@ -24,6 +24,10 @@ export default {
       return id
       return id
         ? vuex.state.threads[id]
         ? vuex.state.threads[id]
         : {}
         : {}
+    },
+    messages () {
+      return this.thread.messages &&
+        this.thread.messages.map(id => vuex.state.messages[id])
     }
     }
   },
   },
   watch: {
   watch: {

+ 18 - 13
examples/chat/vuex/index.js

@@ -8,24 +8,29 @@ Vue.use(Vuex)
 export default new Vuex({
 export default new Vuex({
   state: {
   state: {
     currentThreadID: null,
     currentThreadID: null,
-    threads: {/*
+    threads: {
+      /*
       id: {
       id: {
         id,
         id,
         name,
         name,
-        messages: {
-          id: {
-            id,
-            threadId,
-            threadName,
-            authorName,
-            text,
-            timestamp,
-            isRead
-          }
-        },
+        messages: [...ids],
         lastMessage
         lastMessage
       }
       }
-    */}
+      */
+    },
+    messages: {
+      /*
+      id: {
+        id,
+        threadId,
+        threadName,
+        authorName,
+        text,
+        timestamp,
+        isRead
+      }
+      */
+    }
   },
   },
   actions,
   actions,
   mutations,
   mutations,

+ 10 - 8
examples/chat/vuex/mutations.js

@@ -36,7 +36,7 @@ function createThread (state, id, name) {
   const thread = {
   const thread = {
     id,
     id,
     name,
     name,
-    messages: {},
+    messages: [],
     lastMessage: null
     lastMessage: null
   }
   }
   set(state.threads, id, thread)
   set(state.threads, id, thread)
@@ -46,16 +46,18 @@ function createThread (state, id, name) {
 function addMessage (state, message) {
 function addMessage (state, message) {
   // add a `isRead` field before adding the message
   // add a `isRead` field before adding the message
   message.isRead = message.threadID === state.currentThreadID
   message.isRead = message.threadID === state.currentThreadID
+  // add it to the thread it belongs to
   const thread = state.threads[message.threadID]
   const thread = state.threads[message.threadID]
-  set(thread.messages, message.id, message)
-  thread.lastMessage = message
+  if (!thread.messages.some(id => id === message.id)) {
+    thread.messages.push(message.id)
+    thread.lastMessage = message
+  }
+  // add it to the messages map
+  set(state.messages, message.id, message)
 }
 }
 
 
 function setCurrentThread (state, id) {
 function setCurrentThread (state, id) {
   state.currentThreadID = id
   state.currentThreadID = id
-  // mark thread messages as read
-  const thread = state.threads[id]
-  Object.keys(thread.messages).forEach(mid => {
-    thread.messages[mid].isRead = true
-  })
+  // mark thread as read
+  state.threads[id].lastMessage.isRead = true
 }
 }