计算/异步数据获取

时间:2018-07-16 11:58:03

标签: javascript json vue.js couchdb pouchdb

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

app.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>

app.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
        }
    }
})

希望您可以教给我正确的方法,以便将数据提取到Vue实例中!

1 个答案:

答案 0 :(得分:2)

欢迎您!

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

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

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

在您的情况下,您将:

  1. 将您的tableData转换为内部data,就像您的tableHead
  2. couch.fetchData钩子中调用created函数。
  3. 在返回了Promise then链的函数中(或等待之后),将结果分配给tableData
  4. 在模板中使用tableData(无需更改)

例如查看Vue cookbook to consume APIs with Axios