A Vue.js project
# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build
# build for production and view the bundle analyzer report
npm run build --report
For a detailed explanation on how things work, check out the guide and docs for vue-loader.
http.createServer((req,res) => {
//设置响应头解决跨域
.....
//导入资源
let sliders = require('./index.js')
//获取请求url
let {pathname,query} = url.parse(req.url);
//获取轮播图
if(pathname === '/sliders') {
res.end(JSON.stringify(sliders))
}
}).listen(4000)
function read(callback) {
fs.readFile('./books.json','utf8',(err,data) => {
if(err) {
callback([]);
}
callback(JSON.parse(data));
});
}
axios.interceptors.response.use(function (res) {
return res.data;
},function (error) {
return Promise.reject(error);
});
export let removeBook = (id) => {
//使用es6模板字符串
return axios.delete(`/remove?id=${id}`);
}
//读取文件原有资源
read(function(books) {
//根据id过滤删除的数据
books = books.filter(item => item.bookId !== query.id);
//数据重新写入文件中
write(books,function() {
//删除成功后,遵循规范,向前端返回一个空对象(阮一峰 restful)
res.end(JSON.stringify({}));
});
});
//删除某本图书
async remove(id) {
await removeBook(id);
//前台处理删除
this.allBooks = this.allBooks.filter(item => item.bookId !== id);
}
//路由配置
{
path: '/detail/:bid',
name: 'detail',
component: Detail
}
//
<router-link :to="{name:'detail',params:{bid:book.bookId}}"></router-link>
async getData() {
this.book = await getBook(this.$route.params.bid);
}
<!-- .stop处理事件冒泡 -->
<button class="remove" @click.stop="remove(book.bookId)">删除</button>
let str = '';
//获取前台发送的数据
req.on("data",chunck => {
str += chunck;
});
req.on('end',() => {
//将前端数据转化为json类型
let book = JSON.parse(str);
read(function(books) {
//遍历books.json文件,如果找到与id匹配的项,
//则用前台发来的数据替换,否则返回项本身
books = books.map(item => {
if (item.bookId === id) {
return book;
}
return item;
});
//将新的数据写入books.json文件
write(books,function() {
res.end(JSON.stringify({}));
});
});
});
export let updateBook = (id,data) => {
return axios.put(`/update?id=${id}`,data);
}
//设置响应头解决跨域问题
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
res.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token");
res.setHeader("X-Powered-By",' 3.2.1')
res.setHeader("Content-Type", "application/json;charset=utf-8");
<keep-alive>
<router-view v-if="$route.meta.KeepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.KeepAlive"></router-view>
let pageSize = 5; //定义每次加载的数量
if(pathname === '/page') {
//拿到前台传递的id
let index = query.index || 0;
let hasMore = true;
read(function(books) {
let result = books.slice(index,index+pageSize);
//当本次请求的数据少于5条时,hasMore设置为false,发送给前台
if(result.length <= index+pageSize) {
hasMore = false;
}
//发送hasMore及响应数据给前台,books为result的别名
res.end(JSON.stringify({hasMore,books:result}));
});
}
export let getPage = (index) => {
return axios.get(`/page?index=${index}`);
}
async getBooks(index) {
let {hasMore,books} = await getPage(index);
//合并图书
this.allBooks = [...this.allBooks,...books];
this.hasMore = hasMore;
this.index = this.allBooks.length;
}
<div id="scroll" ref="scroll"></div>
this.$refs.scroll === document.getElementById('scroll')
//clientHeight (clientWidth) 可视高度(宽度)
//scrollTop (scrollTop) 卷走的高度(宽度)
//scrollHeight (scrollWidth) 盒子的真实高度(宽度)
let {clientHeight,scrollTop,scrollHeight} = this.$refs.scroll;
//条件,当可视高度及卷走高度相加还剩20到达scrollHeight时发送请求
if((clientHeight + scrollTop + 20) >= scrollHeight) {
this.getMore();
}
//清除定时器,保证只有一个定时器在使用
clearTimeout(this.timer);
//设置定时器,实现事件节流
this.timer = setTimeout(() => {
let {clientHeight,scrollTop,scrollHeight} = this.$refs.scroll;
if((clientHeight + scrollTop + 20) >= scrollHeight) {
this.getMore();
}
},30);
//有更多数据或者加载完成之后请求数据
if(this.hasMore && this.hasLoad) {
this.hasLoad = false;
let {hasMore,books} = await getPage(index);
//合并图书
this.allBooks = [...this.allBooks,...books];
this.hasMore = hasMore;
this.index = this.allBooks.length;
this.hasLoad = true;
}