首页 > 其他分享 >Vue 07

Vue 07

时间:2023-02-21 19:23:19浏览次数:50  
标签:Vue 07 age js myMixins vue 组件 路由

Vue

当我们下载了其他人的vue,是没有依赖的,这是我们需要执行下面这句:
	cnpm install 
就会将我们需要的项目的依赖都安装上。

#做成纯净的vue项目
	- 在router的index.js中删除about的路由
    -删除所有与的小组件和about页面组件
    -APP.vue 只留下
    <template>
      <div id="app">
        <router-view/>
      </div>
    </template>

props的小补充:

** 自定义属性,在子组件中接收传入的数据**

# 方式一: 使用数组
	props:['name']
    
# 方式二: 使用对象,给传入的对象做出限制
porpos:{name:Number}

# 方式三: 使用对象,默认值和必填
props:{
    name:{
        type:String, # 类型
        required:true, # 必要xing
        default:"默认值",# 在没填数值就会使用这个字符串
    }
}

混入mixin

概念:

  • 混入(mixin)提供了一种非常灵活的方式来分发Vue组件中的可复用功能。一个混入对象包含任意组件选项(如data,methods,mounted等等)。当组件使用混入对象时,所有混入对象的选项将被【混入】进入该组件本身的选项。

基本使用:

	1.定义混入对象在src下新建一个mixin包,包下创建mixin.js
	2.因为 mixins 是一个 js 对象,所以应该以对象的形式来定义 myMixins,在对象中可以和 vue 组件一样来定义 data、components、methods、created、computed 等属性,并通过 export 导出该对象。
也可以在 views 文件夹某个页面文件下创建 mixins 文件夹。(一切视设实际情况而定)
	3. 在需要调用的组件中引入mixin.js 文件,然后再export default 中引用需要的对象即可。
    export const 【mixin名称】 = {
            methods: {
                showName() {
                    alert(this.name);   // 没有this.name
                },
            },
            mounted() {
                console.log("你好啊!,页面挂在执行");
            },
        }
    
    4. 在局部使用(只要在当前组件中使用)
    import{mixin名称} from "@/mixin"
    配置项
    mixins:[定义mixin名字]
    
    5.在组件中,直接使用即可

Mixin 的特点:

1.方法和参数在各自组件中不共享

	虽然组件调用了mixi并将属性合并到自身组件中来,但是其属性只会被当前组件所识别并不会共享,也就是其他的组件无法从当前组件中获取到mixin 中获取到mixin中的数据和方法。

例子:

①首先在 myMixins,js 中定义一个 age 字段和 getAge 方法
export const myMixins = {
  components:{},
  data() {
    return {
      age: 18,
    }
  },
  mounted() {
    this.getAge()
  },
  methods: {
    getAge() {
      console.log(this.age)
    }
  }
}

②组件1中对 num 进行 +1 操作
import { myMixins } from "@/mixins/myMixins.js";
export default {
  mixins: [myMixins],
  data() {
    return {}
  },
  created() {
    this.age++
  },
}

③组件2不进行操作

export default {
  mixins: [myMixins],
  data() {
    return {}
  },
}
④我们分别切换到两个页面,查看控制台输出。会发现组件1改变了age里面的值,组件2中age值还是混合对象的初始值,并没有随着组件1的增加而改变

在这里插入图片描述

Mixin 合并冲突

值为对象,合并冲突
  • 值为对象(components、methods 、computed、data)的选项,混入组件时选项会被合并,键冲突时优先组件,组件中的键会覆盖混入对象的。
①我们在混入对象增加age属性、getAge1方法和getAge2方法
// myMixins.js
export const myMixins = {
  components:{},
  data() {
    return {
      age: 18,
    }
  },
  methods: {
    getAge1() {
      console.log("age1 from mixins =", this.age )
    },
    getAge2() {
      console.log("age2 from mixins =", this.age )
    },
  }
}

②我们在引入了myMixins文件的组件中,增加age属性、getAge1方法和getAge3方法

// template.vue
import { myMixins } from "@/mixins/myMixins.js";
export default {
  mixins: [myMixins],
  data() {
    return {
      age: 20,
    }
  },
  mounted() {
    this.getAge1();
    this.getAge2();
    this.getAge3();
  },
  methods: {
    getAge1() {
      console.log('age1 from template =', this.age)
    },
    getAge3() {
      console.log('age3 from template =', this.age)
    },
  }
}

③我们会发现,组件中的age覆盖了混合对象的age,组件的getAge1方法覆盖了混合对象的getAge1方法

在这里插入图片描述

值为函数,合并冲突

  • 值为函数(created、mounted)的选项,混入组件时选项会被合并调用,混合对象里的钩子函数在组件里的钩子函数之前调用。
// myMixins.js
export const myMixins = {
  components:{},
  data() {
    return {}
  },
  created() {
    console.log('xxx from mixins')
  }
}

2.
import { myMixins } from "@/mixins/myMixins.js";
export default {
  mixins: [myMixins],
  data() {
    return {}
  },
  created() {
    console.log('xxx from template')
  }
}

在这里插入图片描述

mixins 中有异步请求的情况

问题描述:

当混合里面包含异步请求函数,而我们又需要在组件中使用异步请求函数的返回值时,我们会取不到此返回值。如下:

Mymixins.js 文件中:

// myMixins.js
export const myMixins = {
  components:{},
  data() {
    return {
      num: 1,
    }
  },
  methods: {
    getDate1() {
	  new Promise((resolve,reject) => {
	      let a = 1;
	      setTimeout(() => {
	        resolve(a)
	      },500)
	    }).then(res => {
	      console.log(res,'res');
	      return res
	  })
    },
  }
}

todo.vue 文件中:

// todo.vue
import { myMixins } from "./myMixins.js";

export default {
  mixins: [myMixins],
  data() {
    return {}
  },
  mounted() {
    console.log(this.getDate1,'template1-func_one')
  }
}

打印出来的结果:

在这里插入图片描述

解决方案:不要返回结果,而是直接返回异步函数

Mymixins:

// myMixins.js
export const myMixins = {
  components:{},
  data() {
    return {
      num: 1,
    }
  },
  methods: {
   async getDate1() {
	  let result = await new Promise((resolve,reject) => {
	      let a = 1;
	      setTimeout(() => {
	        resolve(1)
	      },500)
	   })
	   return result
    },
  }
}

todo.vue 文件中:

// todo.vue
import { myMixins } from "./myMixins.js";

export default {
  mixins: [myMixins],
  data() {
    return {}
  },
  mounted() {
    this.getDate1().then(res => {
      console.log(res,'template1-res')
    })
  }
}

在这里插入图片描述

与公共组件的区别
组件: 在父组件中引入组件,相当于在父组件中给出一片独立的空间供子组件使用,然后根据 prop 来传值,但本质上两者是相对独立的。


Mixins: 在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件。
与vuex的区别:
vuex: 用来做状态管理的,里面定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改。


Mixins: 可以定义共用的变量,在每个组件中使用,引用组件中之后,各个变量是相互独立的,值的修改在组件中不会相互影响。

vuex

概念:

  • 官方解释Vuex是一个专门为vue.js应用程序开发的状态管理模式+库。它采用了集中式 存储管理应用的所有组件的状态,并以相应的规则状态以一种可预测的方式发生变化。

  • 可以思考一下,组件之间的传值有哪些?有父子通讯,兄弟组件通讯......但是传参对于多层嵌套就显得非常繁琐,代码维护也会非常麻烦。因此vuex就是把组件共享状态抽取出来以一个全局单例模式管理,把共享的数据函数放进vuex中,任何组件都可以进行使用。

关于使用

  • Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架。这需要对短期和长期效益进行权衡。

    如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 store 模式就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。

安装:
方式一:
	在脚手架创建项目时勾选vuex的选项系统会自动创建
 
方式二:
	npm 或yarn 安装
  npm install vuex@next --save
  yarn add vuex@next --save
配置
	如果采用的是脚手架的方式进行创建,无需任何操作,可以忽略此步骤。
	1.新建store文件->index.js,进行如下配置,在main.js中进行引入
   2. 在index.js 中写
        export default new Vuex.Store({
            state: {
                # 放数据,相当于data
            },
            mutations: {
                # 放方法,正常是让actions中来调用,操作state方法
                # 组件也可以直接调用
            },
            actions: {
                # 放方法,正常组件调用,操作异步操作mutation
            }
        })    
 3.在main.js 中注册

image

核心概念

vuex中一共有五个状态 State Getter Mutation Action Module

State:

** 提供唯一的公共数据源,所有共享的数据统一放到store的state进行储存,相似与data **

 在vuex中state中定义数据,可以在任何组件中进行调用
    import Vue from 'vue'
import Vuex from 'vuex'
 
Vue.use(Vuex)
 
export default new Vuex.Store({
  //数据,相当于data
  state: {
    name:"张三",
    age:12,
    count:0
  },
})
调用:
方式一:
	在标签中直接使用 HTML中
    <p>{{$store.state.变量名}}</p>
    
方式二: js中
    this.$store.state.变量名改state中的值
    
方式三:
	从vuex中按需导入mapstate函数
    import {mapSate} from 'vuex';
ps:当前组件需要的全局数据,映射为当前组件computed属性
computed:{mapSate(['name','age'])}

<p>{{$store.state.name}}</p>   # 直接使用
<p>{{$store.state.age}}</p>	# 直接使用

<p>辅助函数{{name+age}}</p> 	辅助函数使用

Mutation

  • 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型 (type)和一个回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数:
使用:
在vuex中定义:
	其中参数state参数是必须的,也可以自己传参数,如下代码,进行计数器的加减操作,加法操作时可以根据所传递参数大小进行相加,减法操作没有传参每次减一

image

2.在组件中使用:
	定义两个按钮进行加减操作
    <button @click="btnClick">点我增加数量	 </button>
<button @click="btnClick1">点我减少数量</button>


方法一:
PS:使用commit触发Mutation操作
methods:{
//加法
btnClick(){
this.$store.commit("addcount",10)     //每次加十
}
//减法
btnClick1(){
this.$store.commit("reduce") 
}
}

方式二:
使用辅助函数进行操作,具体方法同上
  methods:{
  mapMutations(['addcout','raduce']),
    btnClick(){
          this.addcout(10);
    },
    btnClick1(){
    this.raduce();
    },
  }

Action -- 进行异步操作

  • Action和Mutation相似,一般不用Mutation 异步操作,若要进行异步操作,使用Action

    原因:为了方便devtools打个快照存下来,方便管理维护。所以说这个只是规范,而不是逻辑的不允许,只是为了让这个工具能够追踪数据变化而已

使用:

将上面的剑法操作改变成异步操作:

  actions: {
    asyAdd((countext){
      // 异步
  setTimeout(()=>{
    context.comnit('reduce')
  },1000);
}
  },
  
在组件中使用:
方式一:
	直接使用dispatch触发Action函数
	this.$store.dispatch('asynAdd')
	
方式二:
	使用辅助函数

    mapActions(['asynAdd']),
    btnClick2(){
      this.asyncAdd();
    },
推荐正常步骤
  • this.$store.dispatch('actions中的方法',参数)
  • actions中的方法调用 context.commit('mutations',参数)
  • 在mutations中直接修改state的值

也可以直接跨过任何一步直接点:

    this.$store.commit()
    this.$store.state.变量名

插件

  • 功能:主要用于增强vue
  • 本质:包含install方法的一个对象,install的第一个参数是vue,第二个以后的参数是插件使用者传递的数据

使用步骤

1 新建包plugins,新建index.js
    import Vue from "vue";
    import axios from "axios";
    export default {
        install(vue) {
            console.log('执行了插件', vue)
            # 可以做的事
            #  1 了解,自定义指令(不了解没关系)
            #  2 定义全局变量,以后在任何组件中都可以使用到,借助于Vue.prototype往里放 ,以后所有组件只要this.$ajax  就是axios对象
            #  3 使用全局混入
            #  4 自定义全局组件
        }
    }
2. 在main.js中配置
	# 使用自定义插件
  import plugin from "@/plugins"
  vue.use(plugin)

elementuri使用

在vue上,css样式,用的最多的就是elementuri,也还有其他的
	-elementui        做网页端 样式用的多  vue2的 饿了吗团队开发的
    -elementui-plus   第三方团队继续基于vue3写的
    -vant             做app的样式
    -iview            pc端用www.iviewui.com
    
# 使用:
	1 安装
    	cnpm i element-ui -S
    2 配置完整引入  在 main.js 中写入以下内容
        import ElementUI from 'element-ui';
        import 'element-ui/lib/theme-chalk/index.css';
   # 以后在组件中直接使用elementui提供的全局组件即可
        vue.use(ElementUI) 
    3.在组件中使用
    	-在官网中看到自己喜欢的,直接复制粘贴到自己的项目即可

vue Router

  • 路由是负责将进入的浏览器请求映射到特定的组件代码中。 即决定了让谁去响应客户端请求。简单说路由就是url地址和对应的资源的映射,通过一个路径的url地址,可以唯一找到一个资源(一个路由就是一组映射关系(key-value))。路由不包含在vue中,是一个插件,需要单独下载

    在前端中路由中的value是component,用于展示页面内容;key指的是路径。前端路由工作过程:当浏览器的路径改变时,对应的组件就会展示在页面某区域中。

router的使用

vue-router中的一些常用的配置属性:
   mode:配置路由模式,默认为hash,url很丑,可以修改为history,但是需要服务端的支持;
   redirect:重定向,可以设置默认页面;
   linkActiveClass:设置router-link激活样式;
    
1.在创建vue项目时加入了直接使用即可,
	如果没装:npm i vue -router@3(注意:不加@3安装的是4.x版本的路由,vue2只支持3.x版本路由,vue3才支持4.x版本的路由)
    .在src文件夹下创建一个route文件包含一个idnex.js的文件

2.配置路由的跳转(跳转页面组件),只需要在router数组中写对象即可
	const routes = [
            {
                path: '/',
                name: 'index',
                component: Index
            },
            {
                path: '/home',
                name: 'home',
                component: Home
            }
        ]
 3.一定要写一个视图钻进 Home

  -<router-link>   跳转用  类似于a链接
    -<router-view/>  替换页面组件用

4.点击跳转路由
	js控制
    	this.$router.push('路径')
    标签控制
    	<router-link to="/home">
          <button>点我跳转到home页面</button>
        </router-link>
  
5.路由重定向
	在配置路由的时候添加上redirect属性,指定一个新路由

image

image

路由跳转携带数据的两种方式:
-1 /course/?pk=1  带在路径中使用 ? 携带  
    -2 /course/1/     路径中分割的
    
    -1 第一种方式:/course/?pk=1
    	this.$route.query.pk
    -2 第二种方式:/course/1/ 
    	- router/index中路径得改
             {
                path: '/login/:id',
                name: 'login',
                component: Login
            },
        -this.$route.params.id

关于区分router和route

-this.$router #   new VueRouter对象,实例,可以实现路由的跳转
    -this.$route  #   是当前路由对象,内部有传入的参数
$router
   router是VueRouter的实例方法,相当于一个全局的路由器对象,作用是进行路由跳转的!就像jQuery里的window.location一样,起到的是导航的作用。里面含有很多属性和子对象,例如history对象,导航到不同url,可以使用this.
    
$route
   route是一个跳转的路由对象,每一个路由都会有一个route对象,是一个局部的对象,可以获取对应的name、meta、path、hash、query、params、fullPath、matched、redirectedFrom等

跳转路由的方式:

1.使用对象方式
	-this.$router.push({
        name: 'login',
        // query: {
        //   name: 'lqz',
        //   age: 19
        // },
        params: {
          id: 88
        }
      }) # 这里可以写个对象
    
2.标签形式跳转,传对象形式
<router-link :to="{name: 'login', query: {name: 'lqz'}, params: {id: 999}}">
      <button>点我跳转到home页面</button>
    </router-link>
    

路由守卫

全局守卫:
	-前置路由守卫:在路由前进前执行代码
    -后置路由守卫:在路由跳转走,执行带啊
    
使用:
router/index.js 加入:
	全局签守卫,任意路由跳转都会触发它的执行
    router.beforEach((to,from,next)=>{
       ter.beforeEach((to, from, next) => {
    // to 是去哪,哪个路由对象
    // from 是来自哪,是哪个路由对象  比如从  /--->/login
    // next 是函数,如果加括号执行,就会真正的过去
    console.log('前置路由守卫', to, from, next)
    // next() // 真正跳转到 要去的路径

    if (to.name == 'login') {
        console.log('走了')
        next()
    } else {
        var res = localStorage.getItem('userinfo')
        if (res) {
            next()
        } else {
            alert('您没有登录')
            // 跳转到login--->
            // console.log(this)
            // router.push({name:'login',params:{id:99}})
        }
    } 
    })

localStorage系列

# 都是在浏览器存储数据的--》存数据有什么用?
	-登录成功 token存在本地
    -不登录加入购物车功能,
    localStorage中
    -组件间通信----》 跨组件
    
# localStorage
	-永久存储,除非清空缓存,手动删除,代码删除
    -localStorage.setItem('userinfo', JSON.stringify(this.userInfo))
    -localStorage.getItem('userinfo')
    -localStorage.clear()  // 清空全部
    -localStorage.removeItem('userinfo') 
# sessionStorage
	-关闭浏览器,自动清理
    -sessionStorage.setItem('userinfo', JSON.stringify(this.userInfo))
    -sessionStorage.getItem('userinfo')
    -sessionStorage.clear()  // 清空全部
    -sessionStorage.removeItem('userinfo') 
# cookie  
	-有过期时间,到过期时间自动清理
    -借助于第三方 vue-cookies
    -cookies.set('userinfo', JSON.stringify(this.userInfo))
    -cookies.get('userinfo')
    -cookies.delete('userinfo')
    

标签:Vue,07,age,js,myMixins,vue,组件,路由
From: https://www.cnblogs.com/qiguanfusu/p/17142118.html

相关文章

  • Vue插件plugins以及ui插件的使用
    Vue插件plugins以及ui插件的使用插件的使用结构我们可以在src文件夹下新建plugins包,在内部写js代码插件,如plugins/index.js,插件的作用就是将涉及Vue实例对象的js代码分离......
  • vscode中html和vue没有自动补全,需要怎么配置
    先安装HTML Snippets插件 点击 文件-首选项-设置,然后根据以下操作  然后在setting.json中加入以下代码  "files.associations":{"*.vue":"htm......
  • leetcode 307. 区域和检索 - 数组可修改 前缀和 | 线段树
    前缀和查询是O(1)更新是O(n)classNumArray{public:vector<int>sum;vector<int>nums;NumArray(vector<int>&nums){this->nums=nums;sum......
  • vue usePop弹窗控制器
    当UI库弹窗无法满足自定义需求时,需要我们自己开发简单的弹窗组件。弹窗组件与普通业务组件开发没有太大区别,重点在多弹窗之间的关系控制。例如:弹窗1,弹窗2由于触发时......
  • vue_element打印
    https://blog.csdn.net/Tom_sensen/article/details/111171934安装npminstallvue-print-nb--save 在main.js文件中注册importPrintfrom'vue-print-nb' Vue.......
  • vue开发大屏项目屏幕适配问题解决方案
    1.新建自定义指令文件如下: 2.文件中插入一下代码:import{App,Directive,DirectiveBinding,nextTick}from'vue'import{throttle}from'lodash-es'import......
  • 1 props其他、 2 混入mixin 、3 插件、 4 elementui使用(重点) 、5 vuex 、6 vue Rout
    目录1props其他2混入mixin3插件4elementui使用(重点)5vuex6vueRouter7localStorage系列1props其他#安装依赖 cnpminstall#做成纯净的vue项目 -在router......
  • vue2 day7
    昨日回顾#1nodejs后端语言---》js语法---》node,npm命令 -npm命令下载模块慢-淘宝的cnpm,以后使用npm的地方都可以使用cnpm#2安装vue-cli创建项目 -vue项目的......
  • Vue全套教程
     1、初识Vuejs1.1、为什么学习Vuejs?可能你的公司正要用Vue将原项目重构可能你的公司新项目决定使用Vue技术栈可能你正在找工作,会发现十个前端八个对Vue有或多或少的要求......
  • Vue 学习笔记-入门(1)
    Vue入门简述​Vue(读音/vjuː/,类似于view)是一套用于构建用户界面的渐进式JavaScript框架。[5]与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核......