背景

在一pc端的web项目里,由于某些特性需要由动态语言处理,所以只在有需要使用vue来处理数据的页面,直接引入vue.js来处理。
由于刚开始并没有打算使用前端来渲染数据和处理交互,所以使用了一些非vue的ui和插件,导致后来冲突坑点不少。
非vue模块化下使用vue,虽然不能import vue文件,使用组件方式也有点恶心,但处理一些事情还是不错的。

使用formdata提交表单数据

先上代码

        var that           = this;
var myForm = document.getElementById("form_add");
var submitFormData = new FormData(myForm);
submitFormData.append('action', this.action);//添加自定义的参数,这里是动作,添加或者修改
layer.load(0,{time:500});
$.ajax({
url : apiAddressAdd,
type : 'POST',
dataType : 'json',
cache : false,
processData : false,
contentType : false,
data : submitFormData
})

有2个参数是必须设置processData 和 contentType

这里要说的是contentType,经实践,不管是否有包括file上传文件或图片,则必须设置为false, 设置为true或不设置,后台都不能获取

jquery赋值不响应input使用v-model绑定的值

在做某个修改数据功能的时候,由于表单的所有数据,使用v-model绑定的, 包括地址。

地址使用了一个jquery地址选择器,   当选择器选择好地址的时候,只是赋值给input,并没有触发v-model绑定的数据

查看了一篇文章,赋值之后,需要触发input的原生input事件,才会响应v-model:方式如下

$("#city-picker")[0].dispatchEvent(new Event('input'))

商品筛选之参数组选择组件

这是很常见的一个功能,本处只是记录一下思路过程,以防日后老年痴呆,请看下图

如图中,有4个参数组,每个参数组只能选定一个参数,选中的参数在下面以标签,点击X可以去掉相应已选择的标签

但由于参数组是从后台输出的接口得到的,也就是说,不同的种类的商品,有不同的参数组,有的可能只有1组参数,也有可能有4组

本篇实现此处功能的前提,数据库表应该设计为:

参数组为单独一张表,如上面的是选择了茶具种类,有:分类、材质 、风格、摆放空间,四种参数组(不同的商品种类可能会有相同的参数组,但统一添加到此表中,即唯一id值不会重复)
参数组的参数项为单独一张表,关联参数组表,和上面情况一样,有可能和别的商品种类的一样的参数组中有相同的参数项(名字就算相同,但是同表中唯一id值不会重复)

这2点也是实现本筛选功能的基础。

以下为代码的实现思路:

先看json数据结构

如图所示,和上面的筛选组件截图对应,4个参数组,每个参数组不同的id,所有参数项的id也不同,即便name相同也没有关系。

请求到参数组的时候,做如下处理

res.data.paramGroup.forEach(function(item){
vm.$set(vm_data.param_group_active,'active_'+item.gid,0);
}) //更新数据
that.dataParamsGroup = res.data.paramGroup;

把参数组所有数据原始格式放到一个叫param_group_active中

这个对象,用来标识当前哪组参数选中的哪项参数项,0,当然就是默认没有选中

然后并遍历参数组,以参数组的唯一id为标识,创建一个响应式的对象,值为0  (注意,这里说的是参数组,非参数组下面的参数项)

得到如下对象

然后看参数组dom结构 :

里面的A标签,就是参数的详细项,激活的状态,就是常见的tab的那个做法

选中当前标签,当然是以class来表示了,上面绑定的class,取决于参数项自己的id,对应 param_group_active组中,激活的值

点击参数项的时候:

参数带入:参数组和id,当前点击的参数项的id,并且vue的set方法来设置响应数据

比如当我选择风格中的花鸟之后,风格的唯一id是14,而花鸟是12

很明了了,可以理解成动态tab。。。

接下来,选中的参数,都要显示在下排,并可以取消。结构如下:

根据我们的激活参数项的数据param_group_active循环出来,大于0,当然是有了选择,

然后你会看到paramsFlattening[item]这个东西,很明显这是一个object,item一看就知道是当前选中的参数项的id值,

这里是要显示所选中的参数项的名称,所以,这个paramsFlattening里面肯定放了参数项的数据

但ahax取回来的数据是一个二维object,暂且这么叫,我们想一个办法,我们在这例子中暂时叫参数扁平化

看代码:

也就是把所有参数项,放到一个新的object中 (注意,我们这里的paramsFlattening是一个计算属性)

以参数项的id为键名,中文名称为值,遍历放进去,得到了这么个对象:

所以我们在dom结构中直接以插值方式调用:{{paramsFlattening[item]}} ,便可以显示所选中的标签的对应中文名称。

接下来是取消选中的标签

从上面的截图中可以看到点击了i  标签(是一个x图标)调用了deleteParam,并带进了参数item, 是参数项的id

来看这个方法:

遍历存放激活状态的对象,这里的key,就是这串:

看哪个对象(每个参数组)的id(记得这里存的是激活的参数项的id)值 和带进来的id值一致,就设为0,

这样,选中的标签那个地方,是依赖这里值大于0才显示的,设为0就不显示了

最后你可能会问,选中是选中了,但怎么提交这些参数数据

在本例中,老衲把这些选中的参数项id值,堆成一块,用,号分隔,开来,当然后台查询的时候还要处理这个数据

封装一个不完美的图片上传类

我们暂且称它为类,虽然不是用es6 class...此处只当充数字量记录一下,没什么难度
使用场景:多个地方需要上传图片,于是搞了这么个东西,有可能直接点file元,也有可能点击的是别的触发元素,比如换头像的时候。

依赖jquery和layer消息,使用formdata数据来当ajax发送的数据,好像有file元素,就要设置这2项:

contentType : false,
processData : false

由于项目中api接口直接统一写进配置文件,则这里不做成参数带进方式

/**
* [图片上传类,统一上传地址]
* @param {[type]} params [description]
* @param {Function} cb [description]
*/
function ClassUploadImage(params,cb){
this.__proxyEl = params.proxyEl;
this.__imgFileInput = params.imgFileInput;
this.__module = params.module;
this.__cb = cb ;
}
//初始化过程
ClassUploadImage.prototype.init = function(){
var that = this //先判断是否有layer和jquery
if(!window.$ || !window.jQuery){alert('没有jquery!'); return false;}
if(typeof layer == 'undefined'){alert('没有引入layer!'); return false;} //绑定代理解发file事件的元素
$(that.__proxyEl).on("click",this,function(){
$(that.__imgFileInput).trigger('click');
}) //绑定文件表单的选择事件,当选择了文件,立即执行上传
$(that.__imgFileInput).change(function(){
var files = $(this)[0].files[0];
var formObj = new FormData();
formObj.append('image', files);
formObj.append('module', that.__module);
that.upload(formObj);
});
}
//上传过程
ClassUploadImage.prototype.upload = function(formObj){
var that = this;
console.log('执行上传!');
layer.load(0, {shade: false,time:300});
$.ajax({
url : apiImageUpload,
type : 'post',
dataType : 'json',
data : formObj,
cache : false,
contentType : false,
processData : false
})
.done(function(res) {
//此处未对返回的报文进行状态码判断
$.lightTip.success(res.msg);
that.__cb(res);
})
.fail(function(e) {
console.log('不知发生了什么错误...');
})
}

使用:

   //上传图片初始化
var myUploadImg = new ClassUploadImage({
proxyEl:'#proxyuploadbutton,#proxyuploadimg',
imgFileInput:'#image',
module:'headimg'
},function(res){
$(".header_original_img").val(res.img);
$("#proxyuploadimg").attr('src',res.imgurl)
});
myUploadImg.init();
参数__proxyEl为代理input的点击事件元素,如果忽略此参数,就只能直接点击file元素

data 里的Object变量中的Array类型属性值坑人记录

场景: 产品详情页数据返回的对象中,其中有一个是数组类型,是产品的相册

{
"code": 0,
"msg": "数据正常!",
"data": {
"id": 1,
"img": "http://dummyimage.com/360x360",
"name": "唐五代耀州窑剔刻莲瓣水注",
"artist": "艺术家名字",
"authorId": 93,
"price": "250000",
"dsc": "镰田先生的天目已经烧造几十年,作品风格古朴自然 ,口部自然露胎,和传统油滴建盏有很多相似之处。微距下,斑纹底部透明有反射膜 ,膜上斑纹大而立体,表面微有有触感。胎体轻盈,色为棕,表面略泛光,喝茶之佳物。",
"view": 779,
"pcid": 2,
"album": [
"http://lorempixel.com/600/600/technics/",
"http://lorempixel.com/600/600/technics/",
"http://lorempixel.com/600/600/technics/"
],
"birth": "1986-11-16",
"birthplace": "安徽省 宿州市 埇桥区",
"birthtype": 2,
"awidth": "30",
"aheight": "80",
"liked": 57,
"detail": "事拉我道象特据片四信厂华。种海点支育容量作积斗众运进。南界眼参派传我真音例活术者所。持人较方观切度题始可做习列。主万适等自件教相全门话取用。低金色其命么放从特长拉线经便。",
"selled": 0,
"favorite": 1
}
}

如代码中的album,

如果在视图中直接使用:<img :src="dataProduct.album[0]"/>

可以正常显示图片,但是会报错,并且页面中其它地方某些纯粹的html结构出不来:

 如果使用计算属性:

<div>{{albumFirstImg}}</div>

一样会报上面那个错误

 开发工具中查看,确实是数组没错:

总结应该因为Vue数据包装的问题,没有学习研究过vue源码,不知怎么回事,先放一边
解决办法:直接把返回数据中的album再赋值到data根对象下的album即可正常使用

文章结束

要不,加老衲微信做个朋友?

vue pc端网站项目开发坑点与难度记录的更多相关文章

  1. PC端Web项目开发流程

    从前一直再做前端,突然想到如果有一天领导让自己独立承担一个web 项目的话是否有足够的能力去接这个任务,要学会自己去搭建一些基础的工具信息.所有的这一切在心里都要有个大致的流程,不然真正做的时候难免会 ...

  2. 移动端网站如何开发(电脑端网站到手机端网站我们需要在html代码中添加哪个meta标签)

    移动端网站如何开发(电脑端网站到手机端网站我们需要在html代码中添加哪个meta标签) 一.总结 一句话总结: 添加viewport标签:meta name="viewport" ...

  3. Vue PC端框架

    Vue PC端框架 1. Element 中文文档:http://element-cn.eleme.io/#/zh-CN github地址:https://github.com/ElemeFE/ele ...

  4. PC端网站微信扫码登录

    需求分析:用户通过扫描我们网页的二维码,如果已经绑定我们平台的账户,即成功进入首页,否则提示先绑定个人微信账号. 1.绑定微信账号:是通过关注微信公众号实现绑定个人微信账号.首先通过后台接口获取到ti ...

  5. 微信授权登录-微信公众号和PC端网站

    https://blog.csdn.net/qq_34664239/article/details/79107529 一.微信公众号授权登录——微信公众平台 微信授权登录,并调用后台接口,获取用户信息 ...

  6. 微信公众平台实现pc端网站登录

    亲测通过 1,pc端生成带有当前会话的sessionid的url(通过微信来扫描) 2,扫描后,微信浏览器将访问url,将微信浏览器中的sessionid改成通过url传过来的session(pc端) ...

  7. vue PC端项目中解决userinfo问题

    在vue2 中用脚手架建立的项目,后端提供接口获取数据.在公司做第一个项目的时候不清楚公司里的对接流程,结果后续代码被一个接口整的乱七八糟,这个接口是获取用户信息的接口——'usre/info'. 如 ...

  8. 怎么在移动端模拟pc端进行web开发调试日志

    由于移动端开发,许多地方需要进行手势交互开发,而在pc模拟手机浏览器中不能进行模拟手势,所以无法查看日志,于是网上找了一个,腾讯vConsole,感觉还可以,分享给大家安装也方便 我的项目是基于vue ...

  9. vue 移动端公众号采坑经验

    自己用vue做微信公众号项目有一段时间了,遇到各种奇葩的问题,下面细数那些坑: 第一坑:微信分享导致安卓手机无法调起相册和无法调起微信充值 解决方案: setTimeout(_ => { wx. ...

随机推荐

  1. 洛谷P3588 [POI2015]PUS

    题面 sol:说了是线段树优化建图的模板... 就是把一整个区间的点连到一个点上,然后用那个点来连需要连一整个区间的点就可以了,就把边的条数优化成n*log(n)了 #include <queu ...

  2. GitHub && GitLab

    1.github介绍 Git作为一个开源的分布式版本控制系统,已经被越来越多的人使用,随之需要的就是需要有个专门的地方存储.管理通过Git上传的项目,这就是gitHub gitHub是一个面向开源及私 ...

  3. day29 上周复习

    上周内容回顾 初始面向对象 class 类名(父类1,父类2): 静态属性 = "" # 静态属性,类方法 def __init__(self): # 初始化方法 def func ...

  4. 【 HDU 4936 】Rainbow Island (hash + 高斯消元)

    BUPT2017 wintertraining(15) #5B HDU - 4936 2014 Multi-University Training Contest 7 F 题意 直接看官方的题意和题解 ...

  5. 姿态角(Euler角):yaw pitch roll

    姿态角(Euler角):yaw pitch roll  

  6. 获取泛型的class 反射

    最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使 ...

  7. 利用快排partition求前N小的元素

    求前k小的数,一般人的想法就是先排序,然后再遍历,但是题目只是求前N小,没有必要完全排序,所以可以想到部分排序,而能够部分排序的排序算法我能想到的就是堆排序和快排了. 第一种思路,局部堆排序. 首先, ...

  8. 【CH5105】cookies 贪心+DP

    通过邻项交换法可知,怨气值大的孩子分得的饼干数也应该多(否则交换之后得到的解更优). 观察目标函数的性质,可知目标函数本身是由孩子饼干数的相对大小得到,因此此题中关注的是相对大小. 状态设计:\(dp ...

  9. Windows 服务程序、窗口界面、桌面交互、与远程桌面

    昨天用c写了一个windows服务(服务内部带一个gui窗口+系统托盘),在windows xp sp3上测试,启动服务后,系统托盘显示正常. 但在另一台windows 2003 sp2 上测试(通过 ...

  10. 织梦DedeCMS信息发布员发布文章阅读权限不用审核自动开放亲测试通过!

    文章发布员在织梦dedecms后台添加文章时却要超级管理员审核,这无疑是增加了没必要的工作. 登录该账号发布文章你会发现该文章显示的是待审核稿件,且并没有生成静态文件,在前台是看不到这篇文章的,而多数 ...