对着视频敲了一遍代码,一个多小时的视频,花了我差不多一天的时间(8小时)
一、成果展示

二、项目理解
(一)使用IndexDB(用的是dexie)
什么是IndexDB?
随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据。
通俗地讲,IndexedDB 就是浏览器提供的本地数据库,它可以被网页脚本创建和操作。IndexedDB 允许储存大量数据,提供查找接口,还能建立索引。这些都是 LocalStorage 所不具备的。就数据库类型而言,IndexedDB 不属于关系型数据库(不支持 SQL 查询语句),更接近 NoSQL 数据库。
(二)数据操作
在JS中利用 const userid 将四个输入框中的值,4个button都get到,然后就可以进行一系列的操作了。比如:
1.将数据存入indexDB
bulkcreate是写入数据库的函数,btncreate.onclick实现了点击执行了这个函数。
2.读取数据库的数据
点击btnread这个按钮,触发的是table这个函数,这个函数首先找到tbody,然后create 标签, 然后append到相应的标签下面,这样就生成了表格内容的标签。再通过td.textContent将数据填充进去就可以了。
四、小知识
一、innerText innerHTML textContent 三者在表格里面的区别
innerHTML 可以获取到表格指尖的所有标签机器内容 也可以设置表格内的内容
innerText 可以获取表格最下面一层的内容或设置表格最下面一层的内容(
ddd ) (只能对td操作!!!!)
textContent 可以对每一个表格下面的每一个子元素操作 可以取值 可以赋值; 会打出空白节点
比如下面代码中的textContent 也可以改成innerText。
二、箭头函数
ES6标准新增了一种新的函数:Arrow Function(箭头函数)。
x => x * x
相当于
function (x) {
return x * x;
}
另一个:
var funcName = params => params + 2;
funcName(2);
#结果是 4
#如果没有参数,可以写成:
() => {
statements;
};
四、代码
1.index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Eclectronic Store</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.3/css/all.css">
<link rel="stylesheet" href="./style.css">
</head>
<body>
<div class="container text-center"> <!--加上text-center,h1居中-->
<h1 class="bg-light py-4 text-info"><i class="fas fa-plug"></i> Eclectronic Store</h1>
</div>
<div class="d-flex justify-content-center"> <!--加上justify-content-center居中-->
<form class="w-50">
<input type="text" id="userid" class="form-control" readonly placeholder="ID" autocomplete="off">
<input type="text" id="proname" class="form-control" placeholder="product name" autocomplete="off">
<div class="row">
<div class="col">
<input type="text" id="seller" class="form-control m-0" placeholder="seller" autocomplete="off"> <!--m-0表示 margin为0-->
</div>
<div class="col">
<input type="text" id="price" class="form-control m-0" placeholder="price" autocomplete="off">
</div>
</div>
</form>
</div>
<!--create update read and delet button-->
<div class="d-flex justify-content-center">
<button class="btn btn-success" id="btn-create">Create</button>
<button class="btn btn-primary" id="btn-read">Read</button>
<button class="btn btn-warning" id="btn-update">Update</button>
<button class="btn btn-danger" id="btn-delete">Delete All</button>
</div>
<div class="container d-flex">
<table class="table table-striped">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Product Name</th>
<th scope="col">Seller</th>
<th scope="col">Price</th>
<th scope="col">Edit</th>
<th scope="col">Delete</th>
</tr>
</thead>
<tbody id="tbody">
</tbody>
</table>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dexie/3.2.1-beta.1/dexie.min.js" integrity="sha512-wAsaGgPPRSexV/zXq6eq39OTY6sQ6qVfnHqmmuW6/fTCYXZUAqWHTiQqFACabeRFPMNh8ANNB396xCMzarJ9Yg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="../js/main.js" type="module"></script>
</body>
</html>
2.main.js
import productdb,{
bulkcreate,
getData,
createEle
} from './Module.js'
let db = productdb("Productdb",{
products:'++id,name,seller,price'
});
//input tags
const userid = document.getElementById("userid");
const proname = document.getElementById("proname");
const seller = document.getElementById("seller");
const price = document.getElementById("price");
//buttons
const btncreate = document.getElementById("btn-create");
const btnread = document.getElementById("btn-read");
const btnupdate = document.getElementById("btn-update");
const btndelete = document.getElementById("btn-delete");
//insert value using button
btncreate.onclick = () =>{
let flag = bulkcreate(db.products,{
name:proname.value,
seller:seller.value,
price:price.value
})
// console.log("flag");
proname.value= seller.value=price.value = "";
getData(db.products,(data)=>{
// console.log(data.id);
userid.value = data.id+1 || 1;
});
}
//create event on btn read button
btnread.onclick = table;
function table(){
const tbody = document.getElementById("tbody");
while(tbody.hasChildNodes()){
tbody.removeChild(tbody.firstChild);
};
getData(db.products,(data)=>{
if(data){
createEle("tr",tbody,tr=>{
for(const value in data){
createEle("td",tr,td=>{
// td.textContent = data[value];
td.textContent = data.price === data[value] ? `$ ${data[value]}` : data[value];
})
}
createEle("td",tr,td=>{
createEle("i",td,i=>{
i.className +="fas fa-edit btnedit"
})
})
createEle("td",tr,td=>{
createEle("i",td,i=>{
i.className +="fas fa-trash-alt btndelete"
})
})
})
}
})
}
3.Module.js
// create database
const productdb = (dbname,table) =>{
const db = new Dexie(dbname)
db.version(1).stores(table);
db.open();
/*
const db = new Dexie('myDb');
db.version(1).stores({
friends:'name,age',
})
*/
return db;
}
//insert function
const bulkcreate = (dbtable,data)=>{
let flag = empty(data);
if(flag){
dbtable.bulkAdd([data]);
console.log("success")
}else{
console.log("error...")
}
}
//check textbox validation
const empty = object =>{
let flag=false;
for(const value in object){
if(object[value]!=""&& object.hasOwnProperty(value)){
flag=true;
}else{
flag=false;
}
}
return flag;
}
// get data from the databse
const getData=(dbtable,fn)=>{
let index = 0;
let obj = {};
dbtable.count((count)=>{
if(count){
dbtable.each(table=>{
obj = Sortobj(table);
fn(obj,index++);
})
}else{
fn(0);
}
})
}
//Sort obj
const Sortobj = sortobj=>{
let obj = {};
obj = {
id:sortobj.id,
name:sortobj.name,
seller:sortobj.seller,
price:sortobj.price,
}
return obj
}
// create dynamic elements
const createEle = (tagname, appendTo, fn) => {
const element = document.createElement(tagname);
if (appendTo) appendTo.appendChild(element);
if (fn) fn(element);
};
export default productdb;
export{
bulkcreate,
getData,
createEle,
}
参考:
https://www.youtube.com/watch?v=pcelNF8Ckhk