IndexedDB

var myDB = (function(){
    return {
        dbName: 'usersDB',     // 数据库名
        daVer: 1,              // 数据库版本号
        db: '',                // 用于数据库对象
        dbData: [],            // 用于临时存放数据的数组

// 连接数据库
    openDB: function(){
        var request = indexedDB.open(this.dbName, this.daVer);
        request.onsuccess = function(e){
            db = e.target.result;
            console.log('连接数据库成功');
            // 数据库连接成功后渲染表格
            vm.getData();
        }
        request.onerror = function(){
            console.log('连接数据库失败');
        }
        // onupgradeneeded事件在第一次打开页面初始化数据库时会被调用,或在当有版本号变化时
        request.onupgradeneeded = function(e){
            db = e.target.result;
            // 如果不存在Users对象仓库则创建
            if(!db.objectStoreNames.contains('Users')){
                var store = db.createObjectStore('Users',{keyPath: 'id', autoIncrement: true});
                var idx = store.createIndex('index','username',{unique: false})
            }
        }
    },

    /**
     * 保存数据
     * @param {Object} data 要保存到数据库的数据对象
     */
    saveData: function(data){
        var tx = db.transaction('Users','readwrite');
        var store = tx.objectStore('Users');
        var req = store.put(data);
        req.onsuccess = function(){
            console.log('成功保存id为'+this.result+'的数据');
        }
    },

    /**
     * 更新数据
     * @param {function} callback 回调函数
     */
    updataData: function(key,newData){
        var tx = db.transaction('Users','readwrite');
        var store = tx.objectStore('Users');
        var req = store.get(key);
        req.onsuccess = function(e) {
            var data = e.target.result;
            for (a in newData) {
                data[a] = newData[a]
            }
            store.put(data);
        };
    },

    /**
     * 删除单条数据
     * @param {int} id 要删除的数据主键
     */
    deleteOneData: function(id){
        var tx = db.transaction('Users','readwrite');
        var store = tx.objectStore('Users');
        var req = store.delete(id);
        req.onsuccess = function(){
            // 删除数据成功之后重新渲染表格
            vm.getData();
        }
    },
    /**
     * 根据key查询数据
     * @param {int} key 要搜索的数据主键
     */
    keyServerData: function(key){
        var tx = db.transaction('Users','readwrite');
        var store = tx.objectStore('Users');
        var req = store.get(key);
        req.onsuccess = function(e){
            data = e.target.result;
            console.log(data)
        }
    },
    /**
     * 根据索引查询数据
     * @param {int} key 要搜索的数据主键
     */
    indexServerData: function(index,name){
        var tx = db.transaction('Users','readwrite');
        var store = tx.objectStore('Users');
        var req = store.index(index).get(name);
        req.onsuccess = function(e){
            data = e.target.result;
            console.log(data)
        }
    },
    /**
     * 检索全部数据
     * @param {function} callback 回调函数
     */
    searchData: function(callback){
        var tx = db.transaction('Users','readonly');
        var store = tx.objectStore('Users');
        var range = IDBKeyRange.lowerBound(1);
        var req = store.openCursor(range,'next');
        // 每次检索重新清空存放数据数组
        dbData = [];
        req.onsuccess = function(){
            var cursor = this.result;
            if(cursor){
                // 把检索到的值push到数组中
                dbData.push(cursor.value);
                cursor.continue();
            }else{
                // 数据检索完成后执行回调函数
                callback && callback();
            }
        }
    },
    /**
     * 关闭数据库
     * @param {String} name 数据库名
     */
    closeDB: function(name) {
        db.close();
    },
    /**
     * 删除数据库
     * @param {String} str 数据库名
     */
    deleteDB: function(name) {
        indexedDB.deleteDatabase(name);
    }
}
})()
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="./style.css">
    <script src="node_modules/babel-polyfill/dist/polyfill.min.js"></script>
    <script src="node_modules/_indexeddbshim@3.7.0@indexeddbshim/dist/indexeddbshim.min.js"></script>
</head>
<body>
<div id="app">
    <div class="main">
        <div class="v-form">
            <input type="text" class="v-input" placeholder="请输入姓名" name="username" v-model="username">
            <input type="text" class="v-input" placeholder="请输入年龄" name="age" v-model="age">
            <input type="text" class="v-input" placeholder="请输入邮箱" name="email" v-model="email">
            <button type="text" class="v-btn" @click="submit">提交</button>
        </div>
        <table class="table">
            <thead>
            <th>#</th>
            <th>用户名</th>
            <th>年龄</th>
            <th>邮箱</th>
            <th>操作</th>
            </thead>
            <tr v-for="(item,i) in dbData" :key="item.id">
                <td v-html="i+1"></td>
                <td v-html="item.username"></td>
                <td v-html="item.age"></td>
                <td v-html="item.email"></td>
                <td>
                    <button class="edit" @click="edit(i)">编辑</button>
                    <button class="del" @click="myDB.deleteOneData(item.id)">删除</button>
                </td>
            </tr>
        </table>
        <button @click="fn">更新</button>
        <button @click="searchKey">查询index</button>
        <button @click="searchId">查询key</button>
    </div>
</div>
<script src="https://cdn.bootcss.com/vue/2.2.6/vue.min.js"></script>
<script src="index.js"></script>

<script>

    function fn() {
        myDB.updataData(4,{username: '王老吉'})
    }
    function searchKey() {
        myDB.indexServerData('index','SharkChilli')
    }
    function searchId() {
        myDB.keyServerData(4)
    }
    var vm = new Vue({
        el: '#app',
        data: {
            edit_id: 0,
            username: '',
            age: '',
            email: '',
            dbData: []
        },
        mounted: function(){
            myDB.openDB();
        },
        methods: {
            submit: function(){
                if(this.username && this.age && this.email){
                    var param = {
                        username: this.username,
                        age: this.age,
                        email: this.email
                    }
                    if(this.edit_id > 0){
                        param.id = this.edit_id
                    }
                    myDB.saveData(param);
                    this.getData();
                    this.username = this.age = this.email = '';
                }
            },
            getData: function(){
                var self = this;
                myDB.searchData(function(){
                    self.dbData = myDB.dbData;
                });
            },
            edit: function(index){
                this.username = myDB.dbData[index].username;
                this.age = myDB.dbData[index].age;
                this.email = myDB.dbData[index].email;
                this.edit_id = myDB.dbData[index].id;
            }
        }
    })
</script>
</body>
</html>

原文地址:https://www.cnblogs.com/SharkChilli/p/9183992.html