vue功能:数组、对象深拷贝
// 数组深拷贝
var array=[1,2,453,12,432]
var newArray=JSON.parse(JSON.stringify(vs))
newArray.push(0)
console.log(array) //此时array值不会变化,两个值是独立存在的
*********************************************************************
// 对象深拷贝
let origin = {
name: '张三',
age: 12
}
let target=JSON.parse(JSON.stringify(this.origin));
// 计算属性
computed: {
data: function () {
var obj={};
obj=JSON.parse(JSON.stringify(this.templateData)); //this.templateData是父组件传递的对象
return obj
}
}
vue中如何使用less预处理语言
第一步:首先使用npm下载依赖:npm install --save less less-loader
第二步:安装完成后检查是否安装成功
在package.json中
,查看是否存在:less 和 less-loader
"dependencies": {
"less": "^3.9",
"less-loader": "^5.0.0",
"vant": "^2.8.5",
"vue": "^2.5.2",
"vue-router": "^3.0.1"
}
第三步:在main.js文件中引入
import less from 'less'
Vue.use(less)
这里有个问题,提前说一下:因less-loader版本太高而报错,报错信息如下:
loaderContext.getResolve is not a function
解决方法:修改package.json
文件:(直接修改里面的版本号)
"less": "^3.9",
"less-loader": "^5.0.0",
将less和less-loader版本改为上述版本,然后重新npm install
就可以运行成功了
this.$nextTick()
的使用场景
使用场景:this.$nextTick()
方法主要是用在随数据改变而改变
的dom应用场景中。
vue中数据和dom渲染是异步的,要让dom结构随数据改变,应该放进this.$nextTick()
的回调函数中。
created()使用方法时,dom还没有渲染,如果此时在该钩子函数中进行dom赋值数据(或者其它dom操作)时无异于徒劳,所以,此时this.$nextTick()
就会被大量使用。
created()对应的是mounted()的钩子函数则是在dom完全渲染后才开始渲染数据,所以在mounted()中操作dom基本不会存在渲染问题。
iconfont
字体图标库
- 下载好之后,将字体图标文件fonts,放在assets文件夹里面 assets/fonts
- 在
main.js
导入
// 导入字体图标
import './assets/fonts/iconfont.css'
- 使用字体图标,例如:
<el-input prefix-icon="iconfont icon-user"></el-input> // 用户头像
<el-input prefix-icon="iconfont icon-3702mima"></el-input> // 用户密码锁
防止暴力操作 fastclick
和 移动端调试神器 vconsole
npm install fastclick -S
// 在main.js文件中,引入下面代码
import FastClick from 'fastclick'
FastClick.attach(document.body);
移动端调试神器:vconsole
npm install vconsole -S
// 在main.js文件中,引入下面代码
import Vconsole from 'vconsole';
const vConsole = new Vconsole();
Vue.use(vConsole)
页面数据汇总(上一步、下一步)
适用场景:通过上一步、下一步,逐步收集页面数据,然后在最后一步获取前面收集的页面数据
业务逻辑:
第一步:将页面数据保存在缓存中
- 第一个页面:
this.chooseDates
表示:收集的页面数据
this.chooseDates.sex = '男'
this.chooseDates.age = '18'
localStorage.setItem("student", JSON.stringify(this.chooseDates));
第二步:在下一个页面获取缓存中的数据,将该页面的数据和缓存中的数据进行拼接,重新将数据保存在缓存中
- 第二个页面----最后一个页面:都是使用下面的代码。
this.chooseDates
表示:收集的页面数据
this.chooseDates.math = '良好'
this.chooseDates.english = '优秀'
// 第一步:先获取里面的数据--转换为对象形式。
let date1 = JSON.parse(localStorage.getItem("student"));
// 第二步:然后对象拼接--转换为字符串形式
let dateList = JSON.stringify(Object.assign(date1, this.chooseDates));
// 第三步:重新保存数据
localStorage.setItem("student", dateList);
第三步:在需要的地方,获取缓存中的数据
// 获取localStorage里面的数据
let dataList1 = JSON.parse(localStorage.getItem("student"));
3秒倒计时自动跳转指定页面
data() {
return {
title: "支付结果",
count: "" //倒计时
};
},
created() {
this.threeGo();
},
methods: {
threeGo() {
const TIME_COUNT = 3;
if (!this.timer) {
this.count = TIME_COUNT;
this.show = false;
this.timer = setInterval(() => {
if (this.count > 1 && this.count <= TIME_COUNT) {
this.count--;
} else {
this.show = true;
clearInterval(this.timer);
this.timer = null;
//跳转的页面写在此处
}
}, 1000);
}
}
}
路由发生变化:修改页面标题
在router.js
文件中
{
path: "/student",
component: resolve => require(["./views/va/student.vue"], resolve),
name: "student",
meta: {
pageTitle: 'student页面'
}
}
Route.beforeEach((to, from, next) => {
/* 路由发生变化修改页面title */
document.title = to.meta.pageTitle
next()
})
vue全局组件自动加载注册(重点)
在src / components / 新建global文件夹;这个路径与components/index.js中的配置保存一致
第一步:global / test.vue(测试使用)
第二步:在需要的页面以标签的形式使用即可。<base-test></base-test>
<template>
<div class="create">
this is a test
</div>
</template>
<script>
export default {
// 必须有name属性
name: 'baseTest',
methods: {
}
}
</script>
<style>
</style>
第三步:在components / 新建index.js
import Vue from 'vue'
const requireComponent = require.context(
'./global', // 全局组件自动加载注册:在components / 新建global文件夹(放置全局组件)
true, // 是否查询其子目录
/\.vue$/ // 匹配基础组件文件名的正则表达式
)
requireComponent.keys().forEach(fileName => {
// 获取组件配置
const componentConfig = requireComponent(fileName)
// 全局注册组件
Vue.component(
// 如果这个组件选项是通过 `export default` 导出的,
// 那么就会优先使用 `.default`,
// 否则回退到使用模块的根。
componentConfig.default.name || componentConfig.name,
componentConfig.default || componentConfig
)
})
第四步:在main.js中引入
// 引入全局组件自动加载注册
import './components/index'
防止重复请求接口数据
1.在data中定义:
isscah: true // 防止重复请求接口数据
2.在事件处理函数中,点击事件
clik() {
// 防止重复请求接口数据
if (!this.isscah) {
return false
}
this.isscah = false
接口请求成功:
that.isscah = true
}
vue路由懒加载常用的两种方式
方式一:vue异步组件实现懒加载
方法如下:component:resolve=>(require([‘需要加载的路由的地址’]),resolve)
import Vue from 'vue'
import Router from 'vue-router'
/* 此处省去之前导入的HelloWorld模块 */
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: resolve=>(require(["@/components/HelloWorld"],resolve))
}
]
})
方式二:ES6 提出的import方法
方法如下:const HelloWorld = ()=>import(‘需要加载的模块地址’)
import Vue from 'vue'
import Router from 'vue-router'
// 路由懒加载
const HelloWorld = ()=>import("@/components/HelloWorld")
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component:HelloWorld
}
]
})
router的meta实现前端页面级的访问控制
第一步:哪个页面路径需要设置访问控制,在router.js
中添加meta属性
const routes =[
{
path: 'create',
name: 'movie-create',
alias: 'edit',
component: () => import('../views/movie/create.vue'),
meta: { requiresAuth: true }
}
]
第二步:在router.js中
// 第一步:引入store
import store from '../store/index'
import { Notification } from 'element-ui';
// 路由导航守卫
router.beforeEach((to, from, next) => {
// 判断是否有访问控制标识 meta
if (to.matched.some(record => record.meta.requiresAuth)) {
// 判断是否登录(需要提前在store.js中,设置登录状态 isUserLogin)
if (store.state.isUserLogin) {
next()
} else {
// 友好提示
Notification({
title: '提示',
type: 'warning',
message: '请登录后再访问该页面'
});
next({
path: '/login',
query: { redirect: to.fullPath }
})
}
} else {
next() // 确保一定要调用 next()
}
})
请求进度条效果
安装依赖包:cnpm i nprogress -S
在main.js中:导入Nprogress
包对应的js 和 css
import Nprogress from 'nprogress' js实现进度条效果
import 'nprogress/nprogress.css' css美化进度条
- 在request拦截器中,展示进度条
Nprogress.start()
- 在response拦截器中,隐藏进度条
Nprogress.done()
axios.interceptors.request.use(config=>{Nprogress.start()}) 展示进度条
axios.interceptors.response.use(config=>{Nprogress.done()}) 隐藏进度条
当接口图片无法显示,使用本地默认图片
方法一:使用require方法
参考链接 亲测没有效果(方法暂时保留
)
<img v-bind:src="userData.photo" :οnerrοr="logo" class="img-box4">
******************************
data: () => ({
logo: 'this.src="' + require('../assets/img.png') + '"'
})
方法二:使用onerror事件(亲测有效)
<div class="article_item_img">
<img :src="item.cover" @error="defImg()" alt="img" />
</div>
**************** data中定义变量
defaultImg: require("./img/defPic.png");
*************** methods定义方法:
defImg(){
let img = event.srcElement;
img.src = this.defaultImg;
img.onerror = null; //防止闪图
}
点击图片旋转:换一批
<div class="text2" @click="rotate">
<div class="img_change rotate">
<img
class="img5"
src="../../assets/image/health-2/change.png"
alt="pg5.png"
:style="{transform:'rotateZ('+deg+'deg)',transition: 'all 1s'}"
/>
</div>
<div class="change_article">换一批</div>
</div>
// 旋转 data中定义 deg: 0
rotate () {
this.deg += 90;
if (this.deg >= 360) {
this.deg = 0
}
},
动态渲染本地图片img
<div class="wrap_left" v-for="item of array" :key="item.id">
<img :src="item.img ? require(`../assets/image/${item.img}`) : ''" alt="image" />
</div>
array: [
{
id: 0,
name: '小明',
job: '学生',
address: '北京市中心',
year: '居住10年',
img: 'xm.png'
}
]