vue2+node+mysql demo总结

1.App.vue中:

2.在main.js中的new vueRouter里设置mode:history或者hash ;设置{path:'/',redirect:'home'}默认进入的路径;设置linkActiveClass改变路由激活时的class名;也定义全局基本样式和全局过滤器等,例如:

import moment from 'moment';
Vue.filter('datefmt',function(input,fmtstring){
//    使用momentjs这个日期格式化类库实现日的格式化功能return moment(input).format(fmtstring);
});

在oschina git代码

git init
git add.
git commit -m "项目版本1"
git remote add origin https://git.oschina.net/.../...
git push -u origin master

更改原类库的css时遇到伪类图标时可以修改成自定义图片

.mui-icon-phone:before{content: '';background-image: url(../../statics/imgs/3.png);display: inline-block;//将行间变成块级元素
        width: 50px;height: 50px;background-repeat: round;}

v-bind="{to:'/news/newsinfo/'+item.id}"  特殊写法

通过this.$route.params.id获取main.js中设置的路由id值

用post方法提交评论数据

        postData(){if (this.content.trim().length === 0) {Toast('评论不能为空');return;}this.$http.post('/api/comment/' + this.id, {content: this.content,}).then(res => {                           //, {params: {cId: this.id}}可以传值给后台node服务器,在content后console.log(res);Toast('成功提交');this.list = [{
"user_name": "匿名用户",
"add_time": new Date(),
"content": this.content
}].concat(this.list);
this.content = ''; }) },

get评论数据

            getcommentlist(pageindex=1){
                1.0 确定评论数据的urllet url  = common.apidomain + '/api/getcomments/'+this.id+'?pageindex='+pageindex;
                2.0 发出ajax请求获取数据即可this.$http.get(url).then(function(res){if(res.data.status !== 0 ){Toast(res.data.message);return;}
               3.0  将message数组中的数据赋值给this.listthis.list = this.list.concat(res.data.message);});}

实现更多页的加载

            getmore(){
                1.0 实现this.pageindex值的增加1this.pageindex++;console.log(this.pageindex);               2.0 获取当前this.pageindex值对应的分页数据this.getcommentlist(this.pageindex);}

设置overflow-x:auto;出现x轴滚动条

通过v-bind绑定样式:

    <ul v-bind="{style:'width:'+ulWidth+'px'}">
--------------------------------------------------------------------------------------------------------------
let w = 62;let count = res.data.message.length + 1;this.ulWidth = w * count ;

使用插件时(比如vue-preview)记得确认在webpack.config.js的loader中增加扩展名(如.svg),vue-preview不能放在<a></a>中

在photoinfo的getimgs方法里通过forEach遍历服务器数据,来按照vue-preview的要求更改图片宽高:

        getSuolue(){this.$http.get('/api/suoluetu').then(res=>{
res.data.forEach(item=>{let img=document.createElement('img');img.src=item.src;item.h=img.height;item.w=img.width;});this.list=res.data;})}

 

在子组件inputNumber.vue中定义加和减的方法,通过this.$emit传值给父组件

        methods:{substrict(){this.count--;
                 确保最小值为1if(this.count <1){this.count = 1;}this.sendmessage();},add(){this.count++;this.sendmessage();},sendmessage(){this.$emit('dataobj',this.count);}}

在父组件goodsinfo.vue中

 <inputnumber v-on:dataobj="getcount" class="inputnumber"></inputnumber>----------------------------------------------------------------------------------getcount(count){this.inputNumberCount = count;},
// getcount中的第一个参数就是子组件inputNumber中传递过来的count值     

 

通过localStorage完成在goodsinfo.vue中点击 加入购物车 将数据同步至app.vue中的购物车页面

1. 只有2个vm对象是同一个对象时才能实现父子间传值,于是可以创建一个公共的vm.js文件,(将购买数量添加至app.vue下方的购物车徽章。)

//vm.js
import Vue from 'Vue';export const COUNTSTR = 'inputNumberCount';
export var vm = new Vue();
  //goodsinfo.vue
import {vm,COUNTSTR} from '../../kits/vm.js';

toshopcar(){ // 1.0 触发事件vm.$emit(COUNTSTR,this.inputNumberCount);}
//app.vue
import {vm,COUNTSTR} from './kits/vm.js';// 利用 vm.$on() 来注册 COUNTSTR这个常量代表的事件
    vm.$on(COUNTSTR,function(count){
//        1.0 将count值追加到购物车中var badgeobj = document.querySelector('#badge');badgeobj.innerText = parseInt(badgeobj.innerText) + count;});

2.封装localSg.js

// 1.0 定义常量key,将来操作的localStorage中的数据都以这个key来作为标识
export const KEY = 'goodsdata';
export let valueObj = {goodsid:0,count:0};// 2.0 实现数据的增加
// value;格式: {goodsid:87,count:10}
export function setItem(value){//1.0 获取json格式let jsonString =  localStorage.getItem(KEY);jsonString = jsonString || '[]';let arr =   JSON.parse(jsonString);// 2.0 将value追加进入arr
    arr.push(value);// 3.0 将arr 转换成json字符串保存起来
    localStorage.setItem(KEY,JSON.stringify(arr));
}// 3.0 获取数据
export function getItem(){let jsonString =  localStorage.getItem(KEY);
//    将json格式字符串转换成 js对象// jsonString:是一个标准的json格式jsonString = jsonString || '[]';return JSON.parse(jsonString);
}

在goodsinfo中使用:

    import {setItem,valueObj} from '../../kits/localSg.js'toshopcar(){
//                1.0 触发事件vm.$emit(COUNTSTR,this.inputNumberCount);
//                2.0 将数据保存到localStroage中valueObj.goodsid = this.id;valueObj.count = this.inputNumberCount;setItem(valueObj);}

 

使用index使开关互不干扰

    <div class="row" v-for="(item,index) in datalist"><mt-switch class="switch" v-model="value[index]"></mt-switch>getdatalist(){
//                1.0 从localstorage中获取到所有的商品id值
//                obj的格式:{
//                    87:4,
//                     88:1
//                     }let obj = getgoodsObject();
//                2.0 将id值按照 api的参数格式提交给apilet idstring = '';for(let key in obj){idstring+= key + ',';}idstring = idstring.substring(0,idstring.length-1);//提交服务器的数据格式为/id1,id2,id3...

整合数据格式:从[{"goodsid":87,"count":2},{"goodsid":88,"count":3}]变成{87:2,88:3}

export function getgoodsObject(){
//   获取 数组
/*
* arr的格式:
* [{goodsid:87,count:1},{goodsid:87,count:3},{goodsid:88,count:1}]
* */let arr  = getItem();
// 将arr数组中的goodid相同的多个对象合并成同一个对象let resObj ={};for(let i = 0 ; i<arr.length; i++){if(!resObj[arr[i].goodsid]){//    如果没有当前商品的数据,则添加一个数据resObj[arr[i].goodsid] = arr[i].count;}else{//    已经有当前商品的数据了,则将cont追加let count = resObj[arr[i].goodsid];resObj[arr[i].goodsid] = count + arr[i].count;}}return resObj;
}

 

实现购物车里的购买数量组件cartInputNumber.vue:

拿到服务器的数据后先进行处理:(cart.vue)

            this.$http.get(url).then(function(res){//状态值的判断if(res.data.status != 0 ){Toast(res.data.message);return;}
//                    将locaStorage中的所有的商品对应的count的值赋值给message中每个对象的cou(服务器接口的数据)res.data.message.forEach((item)=>{item.cou = obj[item.id];// obj是从localStorage中获取的数据(let obj = getgoodsObject();//    为了解决一个bug所以必须在此处初始化values数组全部为falsethis.value.push(false);});this.datalist = res.body.message;});

cartInputNumber.vue(cart的子组件)中用props接受initCount和goodsid

        methods:{substrict(){this.count--;
//                确保最小值为1if(this.count <1){this.count = 1;return;}this.sendmessage('substrict');},add(){this.count++;this.sendmessage('add');},sendmessage(type){this.resObj.type = type;this.resObj.goodsid = this.goodsid;this.$emit('cardataobj',this.resObj);}}

在localSg中添加方法:

//obj的格式:{goodsid:87,type:'add'}
export function updateData(obj){let arr  = getItem();let count = 1;if(obj.type ==='add'){//
        arr.push({goodsid:obj.goodsid,count:count});}else{//for(let i =0 ;i < arr.length ; i++){//如果这个对象中的count值等于1,则删除这个对象,否则将这个对象的count减1以后保存回去if(arr[i].goodsid === obj.goodsid){if(arr[i].count > 1){arr[i].count = arr[i].count -1;break;}else{//删除此对象arr.splice(i,1);break;}}}}//    将最新的arr保存回localStorage中
    localStorage.setItem(KEY,JSON.stringify(arr));}

在cart中使用:

    getiInputNumber(resObj){console.log(resObj);
//             1.0 更新localStorage中的数据
                updateData(resObj);//            2.0 更新 this.datalist中的当前数量for(let i = 0;i <this.datalist.length ; i++){if(this.datalist[i].id == resObj.goodsid){if(resObj.type =='add'){this.datalist[i].cou = this.datalist[i].cou + 1;}else{this.datalist[i].cou = this.datalist[i].cou - 1;}break;}}},

 

 

 

 实现小球飞入购物车功能:

                 <transition name="show"  @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter ><div v-if="isshow" class="ball"></div></transition>
---------------------------------------------------------------------------------------------------------动画3个方法beforeEnter(el){
//                设定小球的初始位置el.style.transform = "translate(0px,0px)";},enter(el,done){
//                保证小球出现动画
                el.offsetWidth;//                设置小球的结束位置el.style.transform = "translate(75px,366px)";//                结束动画
                done();},afterEnter(el){
//            重置小球的初始状态this.isshow = !this.isshow;}------------------------------------------------------------------------------------.ball{background-color: red;height: 20px;width: 20px;border-radius: 50%;position: absolute;left:150px;top:10px;transition: all 0.4s ease;z-index: 100;}

转载于:https://www.cnblogs.com/jiuyejiu/p/8361741.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见文本样式及标签

本文设计到常见对文档的处理样式&#xff0c;和块&#xff0c;行标签的特点。 没用什么重要内容&#xff0c;只是自己的一些知识点的回忆&#xff0c;对以前知识的一个梳理过程&#xff0c;望某懒虫加油&#xff01;&#xff01;&#xff01; <!DOCTYPE html> <html l…

寻找内存泄漏:一个案例研究

一周前&#xff0c;我被要求修复一个有内存泄漏问题的webapp。 考虑到过去两年左右的时间里我已经看到并修复了数百个泄漏&#xff0c;我想这有多难。 但是事实证明这是一个挑战。 12小时后&#xff0c;我发现该应用程序中不少于5个漏洞&#xff0c;并设法修复了其中4个漏洞。…

matlab中求积函数,MATLAB软件及高斯勒让德求积公式MATLAB软件及高斯勒让德求积公式.doc...

MATLAB软件及高斯勒让德求积公式MATLAB软件及高斯勒让德求积公式数 值 分 析 课 程 实 验 报 告2012—2013学年度 第二学期系别&#xff1a;数学与计算机科学学院实验课程数值分析班 级10级数学与应用数学2班学 号05姓 名杜宁峰指导教师陈耀庚实验题目学习编写高斯-勒让德计算程…

[HNOI2015] 落忆枫音

题目描述 「恒逸&#xff0c;你相信灵魂的存在吗&#xff1f;」 郭恒逸和姚枫茜漫步在枫音乡的街道上。望着漫天飞舞的红枫&#xff0c;枫茜突然问出这样一个问题。 「相信吧。不然我们是什么&#xff0c;一团肉吗&#xff1f;要不是有灵魂......我们也不可能再见到你姐姐吧。」…

border,padding,margin盒模型理解

安静的敲着键盘&#xff0c;已势不可挡的姿势逼近php&#xff0c;我想我是一个幸福的人&#xff0c;未来不可期&#xff0c;做好现在&#xff0c;偶尔写着自己能看懂的API,慢慢悠悠的回味一下前端基础知识。 本文盒模型理解。 <!DOCTYPE html> <html lang"en&qu…

我的Java自定义线程池执行器

ThreadPoolExecutor是Java并发api添加的一项功能&#xff0c;可以有效地维护和重用线程&#xff0c;因此我们的程序不必担心创建和销毁线程&#xff0c;而将精力放在核心功能上。 我创建了一个自定义线程池执行程序&#xff0c;以更好地了解线程池执行程序的工作方式。 功能性…

php中mysqlstat函数,PHP函数mysql_stat介绍

&#xfeff;定义和用法mysql_stat() 函数返回 MySQL 服务器的当前系统状态。如果成功&#xff0c;则该函数返回状态。如果失败&#xff0c;则返回 false。语法mysql_stat(connection)提示和注释注释&#xff1a;mysql_stat() 目前只返回 uptime、threads、queries、open table…

全选、全部选、反选、提交

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title> </head> <body><form><input type"checkbox" name"items" value"足球"&…

Java中的模板方法设计模式

模板方法模式是一种行为设计模式&#xff0c;它为算法提供了基础方法&#xff0c;称为模板方法&#xff0c;该方法将其某些步骤推迟到子类中&#xff0c;因此算法结构相同&#xff0c;但某些步骤可以由子类根据上下文重新定义。 模板是指预设格式&#xff0c;例如HTML模板&…

android adb源码分析(1)

ADB是Android debug bridge的缩写&#xff0c;它使用PC机可以通过USB或网络与android设备通讯。 adb的源码位于system/core/adb目录下&#xff0c;先来看下编译脚本Android.mk&#xff1a; [plain] view plaincopy# Copyright 2005 The Android Open Source Project # # Andr…

matlab二次二阶距,用Matlab改进一次二阶矩法程序.doc

用Matlab编的计算结构可靠指标的改进一次二阶矩法程序(验算点法)题目&#xff1a;编制改进一次二阶矩法计算可靠指标的程序&#xff0c;并给出算例&#xff0c;要求提供源程序选取的算例为&#xff1a;zg(x,y)x*y-1140&#xff0c;其中x,y服从正态分布&#xff0c;μx38,Vx0.1,…

winform中的数据绑定

1. 简单的数据绑定 例1 using (SqlConnection conn new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ToString())) { SqlDataAdapter sda new SqlDataAdapter("Select * From T_Class Where F_TypeProduct order by F_RootID,F_Order…

jQuery数据表和Java集成

jQuery DataTables是一个开放源代码插件&#xff0c;用于在浏览器中创建表。 它具有许多功能&#xff0c;例如排序&#xff0c;服务器端处理&#xff0c; JQUERY UI主题滚动。 该插件的下载链接&#xff1a; http://www.datatables.net/download/ 在本演示中&#xff0c;我…

CSS 属性 - 伪类和伪元素的区别

伪元素和伪类之所以这么容易混淆&#xff0c;是因为他们的效果类似而且写法相仿&#xff0c;但实际上 css3 为了区分两者&#xff0c;已经明确规定了伪类用一个冒号来表示&#xff0c;而伪元素则用两个冒号来表示。 :Pseudo-classes ::Pseudo-elements 但因为兼容性的问题&…

class-感知机Perception

1 感知机模型1.1 模型定义2 感知机学习策略2.1 数据的线性可分性2.2 学习策略3 学习算法3.1 算法原始形式3.2 收敛性3 学习算法的对偶形式1 感知机模型 感知机perceptron是二类分类问题的线性分类模型&#xff0c;输入为实例的特征向量&#xff0c;输出为实例的类别&#xff08…

图片资源 php,php URL图片资源传参生成对应尺寸图片

最近项目中需要上传大图&#xff0c;然后不同设备请求不同大小的图片&#xff0c;之前有用过一个通过URL参数来获取不同大小的图片的接口感觉设计方式请不错&#xff0c;于是就百度看看类似是如何实现的&#xff0c;找了几天找个两个功能类似的记录下。1、图片服务器 imagemagi…

Java中的方法调用有多昂贵

我们都去过那儿。 在查看设计不良的代码的同时&#xff0c;听听作者对人们永远不应该牺牲性能而不是设计的解释。 而且&#xff0c;您不能说服作者摆脱其500行方法&#xff0c;因为链接方法调用会破坏性能。 好吧&#xff0c;这可能在1996年左右是正确的。 但是自那时以来&…

UVa-116 Unidirectional TSP 单向旅行商

题目 https://vjudge.net/problem/uva-116 分析 设d[i][j]为从(i,j)到最后一列的最小开销&#xff0c;则d[i][j]a[i][j]max(d[i1][j1],d[i-1][j1]) 参考数字三角形,用逆推的方法,先确定最后一列d[i][n-1]a[i][n-1],再确定n-2列,此时d[i][n-2] a[i][n-2]min(d[i][n-1],d[i-1][n…

1.HTML

HTML简介 hyper text markup language 即超文本标记语言。 超文本: 就是指页面内可以包含图片、链接&#xff0c;甚至音乐、程序等非文字元素。 标准模板 <!DOCTYPE html> <html lang"en"><head> <meta charset"U…

error connection reset by peer 104

connection reset by peer的常见原因 1.服务器的并发连接数超过了其承载量&#xff0c;服务器会将其中一些连接关闭&#xff1b;2. errno 104错误表明你在对一个对端socket已经关闭的的连接调用write或send方法&#xff0c;在这种情况下&#xff0c;调用write或send方法后&…