## VUE项目开发 关于跨域的处理 1. C:\Windows\System32\drivers\etc --- 修改映射 localhost jiuzhou.zyd1994.top batu.bchltech.cn 地址在前 域名在后 将要映射的内容 ---- localhost 2. config --- prod.env.js --- API HOST 3. config --- idnex.js --- target ## VUE路由处理 beforeEach ```javascript router.beforeEach((to, from, next) => { console.log(to); if(to.path === '/path'){ to.query.type = true; next(); } }) 页面上要根据路由来处理: var flag = this.$route.query.type; if(flag == true){ console.log('true'); }else{ console.log('false'); } ``` ## ajax 发送大量数据 ajax 发送参数包含大量数据时,后端接口无响应:用post请求并用`JSON.stringify()`处理参数,后端用`JSON.parse`解析 ## node项目启动报错: events.js:160 throw er; // Unhandled 'error' event Process finished with exit code 1 **端口被占用,换一个端口或关掉占用端口** ## 异步请求超时处理 catch ```javascript asyncHttpUtils.getRequest(url,params,headers,function (data) { console.log(data) }).catch(function (error) { console.log('error: '+ error.toString()); }) ``` ## json转内容以','分隔 ```javascript "mainDepts": [ { "mainDeptId": "00000001-0001-0001-0001-000000000001", "mainDeptName": "苏州市(勿删)" }, { "mainDeptId": "00000001-0001-0001-0001-000000000001", "mainDeptName": "苏州市(勿删)" } ], // 正文 var mainFileName = ""; var mainFileId = ""; var mainFileArr = mainDepts; if(mainFileArr && mainFileArr.length > 0) { mainFileName = mainFileArr[0].mainName; mainFileId = mainFileArr[0].mainFileId; } ``` 数据输出: > mainFileName.join(',') --> 苏州市(勿删),吴中区(勿删) ## 报错 "message": "#/attachments: expected type: JSONArray, found: String" 关于message 需要传 json数组形式,传过来是 string 格式。 JSON.parse(attachments) 就OK ## ThenJs ``` thenjs(function(cont){ if(!err){ cont(null, data); }else{ cont(err.message, null); } > cont:{ [Function: cont] _isCont: true } }).then(function(cont, arg){ if(!err){ cont(null, arg); }else{ cont(err.message, null); } > cont:{ [Function: cont] _isCont: true } > arg:undefined 需: cont(null, data); 赋值。下边的result为此处的data. }).finally(function(cont, error,result){ if(error){ var errorStr = error.message; }else{ res.send(result); } > cont:{ [Function: cont] _isCont: true } > error: null > result: 上边返回的结果 }).fail(function(cont, error){}); ``` example: ``` thenjs(function(cont){ db.query(querySql, [], function(err, result, fields){ if(err){ var errIf = {}; errIf.flag = 'sql'; errIf.message = '保存失败'; cont(errIf,null); // **出错,存error,在finally中处理** }else{ cont(null, result); // **保存数据,传至then中的 arg** } }); }).then(function(cont, arg){ console.log(arg); // **上一步操作中的数据result** asyncHttp.postRequest(url, params, headers, function(result){ if(result.code == '00000'){ // **判断对错** arg.data = result; cont(null, arg); } else{ var errIf = {}; // **保存出错信息** errIf.flag = 'api'; errIf.message = result.message; cont(errIf,null); } }); }).finally(function(cont, error,result){ console.log(error); console.log(result); if(error){ **处理错误信息** if(error.flag == 'api'){ // **操作1** }else{ // **操作2** results.success = false; results.code = 400; results.message = error.message; res.send(results); } }else{ // **正常操作** results.success = true; results.code = 200; results.message = '收文退回成功'; results.data = result.data; res.send(results); } }).fail(function(cont, error){}); ``` ## VUE Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程, 我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。 mounted 是将编译好的html挂载到页面完成后执行的钩子函数,此时可以进行发送ajax请求获取数据的操作,进行数据初始化 !! mounted在整个实例生命内只执行一次 chrom调试: F12打开调试工具,会多一个Vue选项。可以看到组件的层级结构。 ## VUE 全局缓存 huancun 在main.js中定义一个全局变量: `` Vue.prototype.appCache = {app:{},news:{}} `` 取: `` var newslist = this.appCache.news.newslist; `` 存: `` that.appCache.news.newslist = that.news; `` ## vue-touch不支持vue2.0的替换方法 ## 基于vue-cli的快速构建 ``` vue init webpack vuename ``` eslint test e2e 都写成no ## webpack-simple vue 轻量级框架 #### VUE-cli 脚手架 Vue-cli是快速构建这个单页应用的脚手架, > 基于vue-cli快速构建 http://www.jianshu.com/p/2769efeaa10a >> vue-cli 目录结构 bulid 里面是一些操作文件,使用npm run * 时其实执行的就是这里的文件 config 配置文件,执行文件需要的配置信息 src 资源文件,所有的组件以及所用的图片都是在这个放着的简单看一下这个文件夹下都放了那些东西 src目录 assets? 资源文件夹,放图片之类的资源, components? 组件文件夹,写的所有组件都放在这个文件夹下,现在有一个写好的组件已经放到里面了, router? 路由文件夹,这个决定了也面的跳转规则, App.vue应用组件,所有自己写的组件,都是在这个组件之上运行了, main.js? ? webpack入口文件,webpack四大特性entry入口、output输出,loader加载器,plugins插件 package.json 项目基本信息。在创建vue-cli之后自动生成。 Vue两大核心思想,**组件化**和**数据驱动**, **组件化** 就是将一个整体合理拆分为一个一个小块(组件),组件可重复使用, **数据驱动** 是前端的未来发展方向,释放了对DOM的操作,让DOM随着数据的变化自然而然的变化,不必过多的关注DOM, 只需要将数据组织好即可。 目录: > src 资源文件,所有的组件以及所用的图片在这 assets 资源文件夹,放图片之类的资源, components 组件文件夹,写的所有组件都放在这个文件夹下,现在有一个写好的组件已经放到里面了, router 路由文件夹,这个决定了页面的跳转规则, App.vue 应用组件,所有自己写的组件,都是在这个组件之上运行了, main.js webpack入口文件,webpack四大特性entry入口、output输出,loader加载器,plugins插件, 可以在项目中build\webpack.base.conf.js第12行看到这个入口文件是哪个 ## click事件 表达式,传参 代码/换方法事件 a标签-->div >替换为: {{content}}{{content}}或 >{{content}}实例中: method:{ toNewsDetail:function(id){ > this.$router.push({path:"/news",query:{newsId:id,callbackurl:"/home"}}); }, } > this.$router.push({path:'/login',query:{referer:'/setting'}}); 在网址中显示 http://localhost:8082/#/login?referer=/setting, query 携带 referer 参数 登陆成功后有个back方法,跳转到这个referer(跳转回去) back:function () { > this.$router.push({path:this.$route.query.referer}); }, 接受端: data(){ return { id: '', title: '', > callbackurl:this.$route.query.callbackurl } }, mounted(){ $loading.show('数据加载中'); var that = this; > var newsId = that.$route.query.newsId; httpUtils.getRequest('/news/newsdetail', {newsId: newsId, uId: this.uId}, function(result){ $loading.hide(); var data = result.data; if(data && data.success){ var news = data.data; that.id = news.id; that.title = news.title; that.original = news.source; that.releaseTime = news.createdTimestamp; that.content = news.content; that.favoriteStatus = news.favoriteStatus; } }); } ## VUE 鉤子 beforeRouteEnter (to, from, next) { next(vm => { // 通过 `vm` 访问组件实例 }) } beforeRouteEnter (to, from, next) { > // 在渲染该组件的对应路由被 confirm 前调用 // 不!能!获取组件实例 `this` // 因为当钩子执行前,组件实例还没被创建 }, > 相当于提前判断 实例: `beforeRouteEnter(to, from, next){ var appId = to.query.appId; var uId = localStorage.getItem('userid'); httpUtils.getRequest('/appstore/appdetail?uId=' + uId + '&appId=' + appId, function(data){ var result = data.data || {}; var appInfo = result.response || {}; if(appInfo){ var appEntrance = appInfo.appEntrance; var subStatus = appInfo.subStatus; //判断是否是true, if(subStatus){` > openApp(appEntrance); //true直接打开 return; }else{ > next(); //false跳出这个判断函数,去执行后边的 } } }); }` ## VUE for循环绑定 表达式 ```vue``` ## vue 加载图片 ## vue beforeRouteLeave用法 ```vue beforeRouteLeave(to, from, next) { if(this.dialogStatus){ next(false) // next(false) 不能跳转【代码返回和安卓的物理返回按键都不能跳转】 }else{ next() // 可以跳转 } }, ``` ## VUE可以直接在页面上进行数据操作 {{item.name.substring(item.name.length - 2)}}
## VUE created VUE实例之后执行加载数据 mounted之前 ### VUE页面数据都是在data中注册的 ### v-for # VUE 记录滚动条实时位置 mounted () { // 读 setTimeut(function(){ document.body.scrollTop = parseInt(sessionStorage.getItem('pos')); }, 1000); // 存 window.onscroll = function () { sessionStorage.setItem('pos', document.body.scrollTop); } } ## VUE computed computed相当于属性的一个实时计算,如果实时计算里关联了对象,那么当对象的某个值改变的时候,同事会出发实时计算。 ## 返回 >事件当中: `window.history.back(-1);` that.$router.push({path: '/staffdetail?staffid=' + that.userid}); ## VUE - package.json 中 script 命令: "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot --port=8080", "build": "cross-env NODE_ENV=production webpack --progress --hide-modules", cross-env 能够不分系统地在全局注入变量,上面这条命令就是将 development 注入 NODE_ENV 环境变量 ## VUE created钩子在实例被创建之后调用 created: function () { // `this` 指向 vm 实例 console.log('a is: ' + this.a) } ## VUE router.go router.push 为了与 HTML5 History API 保持一致性, router.go 已经被用来作为 后退/前进导航,router.push 用来导向特殊页面。 ##你可以 router-view 当做是一个容器,它渲染的组件是你使用 vue-router 指定的。 ## package.json >> package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。 npm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。 只输入install就按照项目的根目录下的package.json文件中依赖的模块安装,这个文件里面是不允许有任何注释的, 每个使用npm管理的项目都有这个文件,是npm操作的入口文件。 package.json文件可以手工编写,也可以使用npm init命令自动生成。 npm init :只有项目名称(name)和项目版本(version)是必填的,其他都是选填的。 $ npm install express --save $ npm install express --save-dev 上面代码表示单独安装express模块,--save参数表示将该模块写入dependencies属性,--save-dev表示将该模块写入devDependencies属性。 ``` { "name": "liujiang", `项目名称` "version": "1.0.0", `项目版本` "author": "", "keywords":["node.js","javascript"], //放简介,字符串 "config": { // config字段用于添加命令行的环境变量 "port": "8080" // 在server.js脚本就可以引用config字段的值 }, "private": true, //private 如果你设置"private": true,npm就不会发布它。 这是一个防止意外发布私有库的方式。 "scripts": { //运行脚本命令的npm命令行缩写 "start": "node index.js" }, "repository": { // 指定你的代码存放的地方 "type": "git", "url": "https://path/to/url" }, "dependencies": { // 项目运行所依赖的模块 --> 模块名和对应的版本要求组成,表示依赖的模块及其版本范围。 "axios": "^0.15.3", "babel": "^6.23.0", "bable-loader": "0.0.1-security", "css-loader": "^0.28.5", "postcss": "^5.2.17", "postcss-loader": "^1.3.3", "raf.js": "0.0.4", "vue": "^2.1.0", "vue-loader": "^13.0.4", "vue-router": "^2.2.1", "vue-template-compiler": "^2.4.2" }, "devDependencies": { // 项目开发所需要的模块 "babel-core": "^6.0.0", "babel-loader": "^6.0.0", "babel-preset-es2015": "^6.0.0", "cross-env": "^3.0.0", "css-loader": "^0.25.0", "fastclick": "^1.0.6" }, "bin": { // bin项用来指定各个内部命令对应的可执行文件的位置。 "someTool": "./bin/someTool.js" // 上面代码指定,someTool 命令对应的可执行文件为 bin 子目录下的 someTool.js。 }, // 像下面这样的写法可以采用简写。 "script s": { "start": "./node_modules/someTool/someTool.js build", // 简写为 "start": "someTool build" } // main字段指定了加载的入口文件,require('moduleName')就会加载这个文件。这个字段的默认值是模块根目录下面的index.js。 } ``` ## VUE router.go router.push 为了与 HTML5 History API 保持一致性, router.go 已经被用来作为 后退/前进导航,router.push 用来导向特殊页面。 ## 你可以 router-view 当做是一个容器,它渲染的组件是你使用 vue-router 指定的。 ## ionic 是一个强大的 HTML5 应用程序开发框架。 ionic是一个轻量的手机UI库,具有速度快,界面现代化、美观等特点 ``` ``` /* * ionic框架 */ ## node express 项目 1、创建项目:`express 项目名` 2、cd 到项目中: `npm install`下载所需依赖包即可 ## node报错 app.set is not a function 【解决方法:】 > app.js最后面加上: module.exports = app; ##node 访问链接 -- 访问一个网址 -- 路由-- 请求数据 -- 把数据装html中 -- 把html当做返回值 ## node 报错 ``` throw new TypeError('Router.use() requires middleware function but got a ' + gettype(fn)); ^ TypeError: Router.use() requires middleware function but got a Object ``` 可能是app.js中新引入的文件`app.use('/supercisor', require('./routes/supervisor'));` 最后没有引出抛出路由`` ## captchapng 图片验证码 node 依赖包 ## node后台传数据: encodeURIComponent编码 数据处理方法1: URL:http://blog.csdn.net/down177/article/details/40988731 [发送] ` var data = encodeURIComponent(encodeURIComponent(JSON.stringify(result))); res.render('/url',data:data) ` [接受] `data = JSON.parse(decodeURIComponent(decodeURIComponent("<%=data%>")));` 两次encodeURIComponent是因为第一次encodeURIComponent的时候出现了"%",这个符号在解析参数的时候是无法解析的, 必须把"%"也进行编码,"%"编码后就是"%25",这样就不会出现问题了。 ## “Can’t set headers after they are sent.” node express发送请求时报错 翻译为 “不能发送headers因为已经发送过一次了” => 在处理HTTP请求时,服务器会先输出响应头,然后再输出主体内容,而一旦输出过一次响应头(比如执行过 res.writeHead() 或 res.write() 或 res.end()), 你再尝试通过 res.setHeader() 或 res.writeHead() 来设置响应头时(有些方法比如 res.redirect() 会调用 res.writeHead()), 就会报这个错误。 (说明:express中的 res.header() 相当于 res.writeHead() ,res.send() 相当于 res.write() ) 原因就是你程序有问题,重复作出响应,具体原因很多,需要自己根据以上的原则来排除。 ``` router.get('/', function (req, res) { var uid = req.session.uid; if (!uid) { res.render('login/login', {title: '登录', headerTitle: '平台概览', nav: "index"}); } res.render('platform/overview', {title: '平台概览', headerTitle: '平台概览', nav: "index"}); }); ``` 以上会报错,因为执行了两次`res.render`. ``` router.get('/', function (req, res) { var uid = req.session.uid; if (!uid) { res.render('login/login', {title: '登录', headerTitle: '平台概览', nav: "index"}); } else { res.render('platform/overview', {title: '平台概览', headerTitle: '平台概览', nav: "index"}); } }); ``` ## mouseenter/mouseleave mouseover/mouseout + 包含子元素: mouseover/mouseout + 只有选中元素: mouseover/mouseout ## node md5 加密 模块 ``` var crypto = require('crypto'); function cryptPwd(password) { var md5 = crypto.createHash('md5'); return md5.update(password).digest('hex'); } // digest();方法只能调用一次,所以要封装方法 var password = '123456'; var cryptedPassword = cryptPwd(password); console.log(cryptedPassword); ``` ### KOA 基于nodejs的下一台web开发框架 ## axios 基于 Promise 的 HTTP 异步请求库 > 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 Node.js 中使用 ## promise ES6 是一个对象,原生提供了 Promise 对象。用来传递异步操作的消息。 Promise是ES6的特性,Promise的中文含义为“先知”,Promise对象用于异步计算。 ## waring 不支持windows版本的nodejs `升级nodejs版本` npm install -g ## 运行nodejs 报错 node app.js 报错: Cannot find module 'merge-descriptors' Cannot find module 'ms' ... 把这个文件中的node_modules文件夹删掉,重新npm install,这个文件夹里的有问题 ## 执行npm run dev命令, 程序会先找到根目录下的package.json文件,找到文件中的scripts项,找到对应的dev命令,执行dev对应的命令,这里我们也可以不用npm run dev 直接输入dev后面的命令效果是一样的,这样做的目的是因为有时命令会很长有很难记住,这种方式会非常的方便, 具体只用可以参考阮一峰老师的**npm_script使用指南** ## swiper等插件的 name 之类的值加载不出来,可能是node、npm 版本太低。需重新下载安装node最新版本和 npm install所有 升级 node 版本 n 不支持windows版本 http://blog.csdn.net/s_521_h/article/details/76110926 n 不支持windows版本 需重新下载node最新版本 ## node express中res.redirect 跳转 重定向 跳转到'/hello' 显示‘asdf’ ``` var express = require('express'); var app = express(); app.get('/', function (req, res) { res.redirect('/hello'); }); app.get('/hello',function(req,res){ res.end('asdf'); }); app.listen(4100); console.log("http://localhost:4100"); ``` ## 字符转义 '\'' ```javascript var html = '{{category}}{{index}}
{{appData[category][index++].appName_cn}}'; ``` ## 下载文件 关于十三五精神学习通知.docx ## 注意! warning !!! html标签li中的value问题 ui 的 li 是有序列表 在`html`的`li`标签的属性`value`是有规定的:规定列表项目的数字,所以`value`只能是数字。 ```html 下载``` ```javascript var liValue = $('#test').val(); alert(liValue); //此结果为7 var liValueTwo = $('#test').attr("value"); alert(liValueTwo); //此结果为007 ``` ## 自定义属性、类型 ## 七行代码将你的网站变成移动应用 https://mp.weixin.qq.com/s?__biz=MzUxMzcxMzE5Ng==&mid=2247488736&idx=1&sn=c9bf2e5cbbfa174a99b73425a919ae37&chksm=f951a1a3ce2628b51719821caadcb35d820b0366c4ecf8f82bbe6f5e2f4714cf52fd051fbe6e&scene=27#wechat_redirect ## 获取select标签内容 var selectData = $('option:selected', '#task-list').val(); ## 前端-打印指定内荣容 print https://www.cnblogs.com/not-NULL/p/5395962.html ## 判断IE浏览器类型、版本 https://www.cnblogs.com/XCWebLTE/archive/2017/06/15/7017338.html ## input 只读方式 readonly属性:`readonly` ```html ``` ## @charset "utf-8"; CSS文化开头声明: `@charset "utf-8";` ## thenjs 异步流程控制库 ## input 可以直接设置最大长度16个字符 **maxlength** ## warning 注意form表单的 **method** `