处理同步/异步问题async/await确定是首选没毛病javascript
双重for循环应该可行?promise.all/promise.race应该可行?仍是async/awaitcss
想起来可能简单,你能够动手试试可否给出你想象中的答案!!!html
"纸上得来终觉浅,绝知此事要躬行。"前端
若是是使用jq的$.ajax
那么就很容易了 $.ajax
有个配置项叫作async
能够理解为请求锁
vue
async
默认是 true,即为异步方式,
.ajax里的success方法,这时候执行的是两个线程。java
async
设置为 false,则全部的请求均为同步请求,在没有返回值以前,同步请求将锁住浏览器,用户其它操做必须等待请求完成才能够执行。ios
var temp;
$.ajax({
async: false,
type : "post",
url : defaultpostdata.url,
datatype : 'json',
success : function(data) {
temp=data;
}
});
alert(temp);
复制代码
这个ajax
请求为同步请求,在没有返回值以前,alert(temp)是不会执行的。git
若是async
设置为:true
,则不会等待ajax请求返回的结果,会直接执行ajax后面的语句github
然而此次重构我抛弃了jq
,必须另寻出路。ajax
// 比方说A=[{userId:a1},{userId:a2},{userId:a3}] B=[{id:b1},{id:b2},{id:b3}]
// A里面的每一个元素须要逐个像B里面的元素发送请求
// this.dialogOtherData.data至关于A this.choseList至关于B
var comment = [
'拍的真好看', '666', '哪里人', '呵呵', '私聊我', '有人啊', '有的', '找我的一块儿啊', '来了老弟!'...
]
async handelLoop() {
var total = this.dialogOtherData.data.length * this.choseList.length
for (let i = 0; i < this.dialogOtherData.data.length; i++) {
var commentData = {}
commentData.userId = this.dialogOtherData.data[i].userId
await this.getData(commentData, i, total)
}
}
async getData(commentData, i, total) {
var random = Math.random()
for (let j = 0; j < this.choseList.length; j++) {
if (this.dialogOtherData.title === '评论') {
commentData.dynamicId = this.choseList[j].id
commentData.type = 1
if (i === 0) {
commentData.content = this.inputVal
} else {
var two = j * Math.random().toString().substr(3, 1)
commentData.content = comment[+random.toString().substr(2, 2) + (+two)]
}
await dynamicOperation(commentData).then(res => {
if (res.succeed) {
if ((i + 1) * (j + 1) === total) {
this.close()
this.$message.success('操做成功')
}
}
})
}
}
}
复制代码
request.js
里不要这么写axios.defaults.withCredentials = true // 让ajax携带cookie
其余接口须要就配置在service里,不要全局默认就Ok了 不须要配置代理什么的就能搞定
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API2, // url = base url + request url
withCredentials: true, // send cookies when cross-domain requests
timeout: 5000 // request timeout
})
复制代码
// 判断数组是否相同
scalarArrayEquals(array1, array2) {
return array1.length === array2.length && array1.every(function(v, i) { return v === array2[i] })
}
复制代码
在公共样式里面设置index.css
一下
// 表格过长显示问题
.el-tooltip__popper {
max-width: 400px;
line-height: 180%;
}
复制代码
// 改变fromData里面的kind是没法改变选择的
data() {
return {
fromData:{
kind:1
}
}
}
//不能是对象里的属性必须是单一属性
data() {
return {
kind:1
}
}
复制代码
element-china-area-data地址 几行代码实现省市区三级联动
npm install element-china-area-data -S
import { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } from 'element-china-area-data'
复制代码
服务端用法:
const { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } = require('element-china-area-data/dist/app.commonjs')
复制代码
provinceAndCityData
是省市二级联动数据(不带“所有”选项)regionData
是省市区三级联动数据(不带“所有”选项)provinceAndCityDataPlus
是省市区三级联动数据(带“所有”选项)regionDataPlus
是省市区三级联动数据(带“所有”选项)CodeToText
是个大对象,属性是区域码,属性值是汉字 用法例如:CodeToText['110000']输出北京市TextToCode
是个大对象,属性是汉字,属性值是区域码 用法例如:TextToCode['北京市'].code输出110000,TextToCode['北京市']['市辖区'].code输出110100,TextToCode['北京市']['市辖区']['朝阳区'].code输出110105<template>
<div id="app">
<el-cascader size="large" :options="options" v-model="selectedOptions" @change="handleChange">
</el-cascader>
</div>
</template>
<script> import { regionData } from 'element-china-area-data' export default { data () { return { options: regionData, selectedOptions: [] } }, methods: { handleChange (value) { console.log(value) } } } </script>
复制代码
v-viewer
git地址用于图片浏览的Vue组件,支持旋转、缩放、翻转等操做,是基于viewer.js
git地址
这一款功能强大配置简单的图片预览插件,详细配置见附录
npm install v-viewer --save
main.js
内引用并注册调用//main.js
import Viewer from 'v-viewer'
import 'viewerjs/dist/viewer.css'
Vue.use(Viewer);
//zIndex默认是2015
Viewer.setDefaults({
Options: { 'zIndex': 2099,"inline": true, "button": true, "navbar": true, "title": true, "toolbar": true, "tooltip": true, "movable": true, "zoomable": true, "rotatable": true, "scalable": true, "transition": true, "fullscreen": true, "keyboard": true, "url": "data-source" }
});
复制代码
xxx.vue
<template>
<div class="content"> <h1>Viewer图片预览插件</h1> <viewer :images="imgs"> <img v-for="src in imgs" :src="src.url" :key="src.title"> </viewer> </div> </template>
<script> export default { data () { return { imgs: [ { url: 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=85690711,3884201894&fm=27&gp=0.jpg', title: '图片1' }, { url: 'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3564877025,796183547&fm=27&gp=0.jpg', title: '图片2' } ] } }, } </script>
复制代码
v-viewer
详细配置说明
import Vue from ‘Vue’
import Viewer from ‘v-viewer’
import ‘viewerjs/dist/viewer.css’
Vue.use(Viewer)
Viewer.setDefaults({
Options: {
'inline': true, // 是否启用inline模式
'button': true, // 是否显示右上角关闭按钮
'navbar': true, // 是否显示缩略图底部导航栏
'title': true, // 是否显示当前图片标题,默认显示alt属性内容和尺寸
'toolbar': true, // 是否显示工具栏
'tooltip': true, // 放大或缩小图片时,是否显示缩放百分比,默认true
'fullscreen': true, // 播放时是否全屏,默认true
'loading': true, // 加载图片时是否显示loading图标,默认true
'loop': true, // 是否能够循环查看图片,默认true
'movable': true, // 是否能够拖得图片,默认true
'zoomable': true, // 是否能够缩放图片,默认true
'rotatable': true, // 是否能够旋转图片,默认true
'scalable': true, // 是否能够翻转图片,默认true
'toggleOnDblclick': true, // 放大或缩小图片时,是否能够双击还原,默认true
'transition': true, // 使用 CSS3 过分,默认true
'keyboard': true, // 是否支持键盘,默认true
'zoomRatio': 0.1, // 鼠标滚动时的缩放比例,默认0.1
'minZoomRatio': 0.01, // 最小缩放比例,默认0.01
'maxZoomRatio': 100, // 最大缩放比例,默认100
'url': 'data-source' // 设置大图片的 url
}
})
复制代码
我是凉城a,一个前端,热爱技术也热爱生活。
与你相逢,我很开心。
文中若有错误,欢迎在评论区指正,若是这篇文章帮到了你,欢迎点赞和关注😊
本文首发于掘金,未经许可禁止转载💌