计算/异步数据获取

paz*_*ero 3 javascript json couchdb pouchdb vue.js

我正在尝试创建简单的 Vue + CouchDB 应用程序。使用 Vanilla JS 可以正常工作,但我无法通过 Promise 或异步函数从数据库获取数据到我的 vue 实例。这是我的代码:

应用程序.html

<div id="vue-app">
  <table>
    <thead>
      <tr>
        <th>{{ tableHead.name }}</th>
        <th>{{ tableHead.lastname }}</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="data in tableData">
        <td>{{ data.name }}</td>
        <td>{{ data.lastname }}</td>
      </tr>
    </tbody>
  </table>
</div>
Run Code Online (Sandbox Code Playgroud)

应用程序.js

const db = new PouchDB('testdb')

const couch = {
  fetchData: async function () {
    var dbData = await db.allDocs({
        include_docs: true,
        descending: true
    }).then(function (result) {
        var objects = {}
        result.rows.forEach(function (data) {
            objects[data.id] = data.doc
        })
        return objects
    }).catch(function(err) {        
        return err
    })
    return dbData
  }
}

var app = new Vue({
    el: '#vue-app',
    data: {
        tableHead: {
            name: 'Name',
            lastname: 'Lastname'
        }
    },
    computed: {
        async tableData () {
            var dbData = await fetchData()
            return dbData
        }
    }
})
Run Code Online (Sandbox Code Playgroud)

希望您能教我将数据获取到 Vue 实例的正确方法!

ghy*_*ybs 6

欢迎来到SO!

计算属性并不意味着是异步的。

解决数据异步检索的通常模式是:

  1. 使用内部data占位符
  2. 在组件生命周期钩子上启动异步请求createdmounted
  3. 请求成功后,data使用新内容更新内部。
  4. data在模板中使用内部。

就您而言,您会:

  1. 把你的tableData变成一个内部的data,就像你的tableHead
  2. 在钩子中调用你的couch.fetchData函数created
  3. 在函数返回的 Promisethen链中(或等待之后),将tableData结果分配给您
  4. 在您的模板中使用tableData(无需更改)

例如,请参阅 Vue食谱以使用 Axios 使用 API