• vue-cli复习


    【1】为什么在 main.js 文件中使用 render 函数而没有使用 template ?原因在于 vue.js 的引入
    请添加图片描述
    【2】关于脚手架的默认配置,可以使用vue inspect > output.js查看。如果想修改默认配置,可以通过在根目录添加一个 vue.config.js 文件,然后根据官方文档在该文件里进行参数配置
    【3】ref 属性: 被用来给元素或子组件注册引用信息(id的替代者),应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc)
    【4】props 配置项有三种使用方式。一是只接收;二是限制类型接收;三是接收的同时对数据,进行类型限制+默认值的指定+必要性的限制。

    props:['name']
    props:{name:String}
    props:{
    	name:{
    		type:String, //类型
    		required:true, //必要性
    		default:'老王' //默认值
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 注意,一般来说 required 和 default不会同时出现。且 props 是只读的,Vue 底层会监测你对 props 的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制 props 的内容到 data 中一份,然后去修改 data 中的数据。这也就说明在处理 data 中的数据时, props 中的数据已经拿到了。

    【5】mixin 混入,可以把多个组件共用的配置提取成一个混入对象,当组件和混入的 data 和 method 发生冲突时以组件为主,其他钩子函数是都要,即合并

    //定义混入
    {
    	data(){....},
    	methods:{....}
    	....
    }
    //使用混入,全局和局部
    Vue.mixin(xxx)
    mixins:['xxx']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    【6】插件,本质上是一个对象,但是里面必须要有 install 方法。install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据。插件就相当于将许多强大的小功能集合在一起,想用的时候直接使用 Vue.use() 引入

    对象.install = function (Vue, options) {
    	// 1. 添加全局过滤器
    	Vue.filter(....)
    	    
    	// 2. 添加全局指令
    	Vue.directive(....)
    	    
    	// 3. 配置全局混入(合)
    	Vue.mixin(....)
    	    
    	// 4. 添加实例方法
    	Vue.prototype.$myMethod = function () {...}
    	Vue.prototype.$myProperty = xxxx
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    【7】props 参数除了可以实现父组件向子组件传递数据,也可以实现子组件向父组件传递数据,但是前提是父组件需要通过 props 向子组件传递一个函数

    //父组件
    <MyHeader :addTodo="addTodo"/>
    methods: {
    	addTodo(todoObj){
    		this.todos.unshift(todoObj)
    	}
    }
    
    //子组件
    props:['addTodo']
    this.addTodo(todoObj)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    【8】Window.sessionStorage 和 Window.localStorage

    存储内容大小一般支持5MB左右(不同浏览器可能还不一样)
    
    浏览器端通过 Window.sessionStorage 和 Window.localStorage 属性来实现本地存储机制。
    
    相关API:
    
    	xxxxxStorage.setItem('key', 'value'); 该方法接受一个键和值作为参数,会把键值对添加到存储中,如果键名存在,则更新其对应的值。
    	
    	xxxxxStorage.getItem('person');
    	
    	​ 该方法接受一个键名作为参数,返回键名对应的值。
    	
    	xxxxxStorage.removeItem('key');
    	
    	​ 该方法接受一个键名作为参数,并把该键名从存储中删除。
    	
    	xxxxxStorage.clear()
    	
    	​ 该方法会清空存储中的所有数据。
    
    备注:
    
    	SessionStorage存储的内容会随着浏览器窗口关闭而消失。
    	LocalStorage存储的内容,需要手动清除才会消失。
    	xxxxxStorage.getItem(xxx)如果xxx对应的value获取不到,那么getItem的返回值是null。
    	JSON.parse(null)的结果依然是null。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    【9】组件的自定义事件

    //一种组件间通信的方式,适用于:子组件 ===> 父组件
    
    //使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。
    
    //绑定自定义事件:
    
    //第一种方式,在父组件中:
    <Demo @atguigu="test"/> 
    //或 
    <Demo v-on:atguigu="test"/>
    
    //第二种方式,在父组件中:
    
    <Demo ref="demo"/>
    ......
    mounted(){
       this.$refs.xxx.$on('atguigu',this.test)
    }
    //若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法。
    
    //触发自定义事件:
    this.$emit('atguigu',数据)
    
    //解绑自定义事件
    this.$off('atguigu')
    
    //组件上也可以绑定原生DOM事件,需要使用native修饰符。
    
    //注意:通过this.$refs.xxx.$on('atguigu',回调)绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    【10】全局事件总线:一种组件间通信的方式,适用于任意组件间通信

    //安装全局事件总线
    new Vue({
    	......
    	beforeCreate() {
    		Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm
    	},
        ......
    }) 
    //使用事件总线
    //接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身
    methods(){
      demo(data){......}
    }
    ......
    mounted() {
      this.$bus.$on('xxxx',this.demo)
    }
    //提供数据
    this.$bus.$emit('xxxx',数据)
    //最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    【11】消息订阅与发布:一种组件间通信的方式,适用于任意组件间通信

    //使用步骤
    //安装pubsub
    npm i pubsub-js
    import pubsub from 'pubsub-js'
    //接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身
    methods(){
      demo(data){......}
    }
    ......
    mounted() {
      this.pid = pubsub.subscribe('xxx',this.demo) //订阅消息
    }
    //提供数据
    pubsub.publish('xxx',数据)
    //最好在beforeDestroy钩子中,用PubSub.unsubscribe(pid)去取消订阅
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    【12】this.$nextTick(回调函数)

    • 作用:在下一次 DOM 更新结束后执行其指定的回调
    • 什么时候用:当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数中执行

    【13】标签:Vue封装的过渡与动画

    //准备好样式
    /*
    元素进入的样式:
    	v-enter:进入的起点
    	v-enter-active:进入过程中
    	v-enter-to:进入的终点
    元素离开的样式:
    	v-leave:离开的起点
    	v-leave-active:离开过程中
    	v-leave-to:离开的终点
    */
    
    //使用包裹要过度的元素,并配置name属性:
    <transition name="hello">
    	<h1 v-show="isShow">你好啊!</h1>
    </transition>
    
    //备注:若有多个元素需要过度,则需要使用:,且每个元素都要指定key值
    <transition-group name="hello" appear>
    	<h1 v-show="!isShow" key="1">你好啊!</h1>
    	<h1 v-show="isShow" key="2">尚硅谷!</h1>
    </transition-group>
    
    // 封装动画
    	.hello-enter-active{
    		animation: atguigu 0.5s linear;
    	}
    
    	.hello-leave-active{
    		animation: atguigu 0.5s linear reverse;
    	}
    
    	@keyframes atguigu {
    		from{
    			transform: translateX(-100%);
    		}
    		to{
    			transform: translateX(0px);
    		}
    	}
    	
    //封装过渡
    	/* 进入的起点、离开的终点 */
    	.hello-enter,.hello-leave-to{
    		transform: translateX(-100%);
    	}
    	.hello-enter-active,.hello-leave-active{
    		transition: 0.5s linear;
    	}
    	/* 进入的终点、离开的起点 */
    	.hello-enter-to,.hello-leave{
    		transform: translateX(0);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    【14】vue 脚手架配置代理服务器

    • 方法一
      在vue.config.js中添加如下配置:
    devServer:{
      proxy:"http://localhost:5000"
    }
    
    • 1
    • 2
    • 3

    优点:配置简单,请求资源时直接发给前端(8080)即可。
    缺点:不能配置多个代理,不能灵活的控制请求是否走代理。
    工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器 (优先匹配前端资源)

    • 方法二
      编写vue.config.js配置具体代理规则:
    module.exports = {
    	devServer: {
          proxy: {
          '/api1': {// 匹配所有以 '/api1'开头的请求路径
            target: 'http://localhost:5000',// 代理目标的基础路径
            changeOrigin: true,
            pathRewrite: {'^/api1': ''}
          },
          '/api2': {// 匹配所有以 '/api2'开头的请求路径
            target: 'http://localhost:5001',// 代理目标的基础路径
            changeOrigin: true,
            pathRewrite: {'^/api2': ''}
          }
        }
      }
    }
    /*
       changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000
       changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:8080
       changeOrigin默认值为true
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    优点:可以配置多个代理,且可以灵活的控制请求是否走代理。
    缺点:配置略微繁琐,请求资源时必须加前缀。

    【15】插槽

    • 作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 父组件 ===> 子组件
    • 分类:默认插槽、具名插槽、作用域插槽
    • 使用方式:
    //默认插槽
    //父组件中
    <Category>
    	<div>html结构1</div>
    </Category>
    //子组件中
    <template>
    	<div>
    		<!-- 定义插槽 -->
    		<slot>插槽默认内容...</slot>
    	</div>
    </template>
    
    //具名插槽
    //父组件中
    <Category>
    	<template slot="center">
    		<div>html结构1</div>
    	</template>
    	
    	// v-slot 必须和 template 标签配合使用
    	<template v-slot:footer>
    		<div>html结构2</div>
    	</template>
    </Category>
    //子组件中
    <template>
    	<div>
    		<!-- 定义插槽 -->
    		<slot name="center">插槽默认内容...</slot>
    		<slot name="footer">插槽默认内容...</slot>
    	</div>
    </template>
    
    //作用域插槽
    //  理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。(games数据在Category组件中,但使用数据所遍历出来的结构由App组件决定)
    //  作用域插槽必须使用 template 标签,且 scope 后面的参数收到的值是一个对象,一个包含了子组件中 slot 标签传来的数据的对象
    //父组件中
    		<Category>
    			<template scope="scopeData">
    				<!-- 生成的是ul列表 -->
    				<ul>
    					<li v-for="g in scopeData.games" :key="g">{{g}}</li>
    				</ul>
    			</template>
    		</Category>
    
    		<Category>
    			<template slot-scope="scopeData">
    				<!-- 生成的是h4标题 -->
    				<h4 v-for="g in scopeData.games" :key="g">{{g}}</h4>
    			</template>
    		</Category>
    //子组件中
            <template>
                <div>
                    <slot :games="games"></slot>
                </div>
            </template>
    		
            <script>
                export default {
                    name:'Category',
                    props:['title'],
                    //数据在子组件自身
                    data() {
                        return {
                            games:['红色警戒','穿越火线','劲舞团','超级玛丽']
                        }
                    },
                }
            </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    【16】vuex的使用

    • 概念
      ​ 在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。
    • 搭建vuex环境
    //引入Vue核心库
    import Vue from 'vue'
    //引入Vuex
    import Vuex from 'vuex'
    //应用Vuex插件
    Vue.use(Vuex)
    
    //准备actions对象——响应组件中用户的动作
    const actions = {}
    //准备mutations对象——修改state中的数据
    const mutations = {}
    //准备state对象——保存具体的数据
    const state = {}
    
    //创建并暴露store
    export default new Vuex.Store({
    	actions,
    	mutations,
    	state
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 在main.js中创建vm时传入store配置项
    ......
    //引入store
    import store from './store'
    ......
    
    //创建vm
    new Vue({
    	el:'#app',
    	render: h => h(App),
    	store
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 初始化数据、配置actions、配置mutations,操作文件store.js
    //引入Vue核心库
    import Vue from 'vue'
    //引入Vuex
    import Vuex from 'vuex'
    //引用Vuex
    Vue.use(Vuex)
    
    const actions = {
        //响应组件中加的动作
    	jia(context,value){
    		// console.log('actions中的jia被调用了',miniStore,value)
    		context.commit('JIA',value)
    	},
    }
    
    const mutations = {
        //执行加
    	JIA(state,value){
    		// console.log('mutations中的JIA被调用了',state,value)
    		state.sum += value
    	}
    }
    
    //初始化数据
    const state = {
       sum:0
    }
    
    //创建并暴露store
    export default new Vuex.Store({
    	actions,
    	mutations,
    	state,
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 组件中读取vuex中的数据:$store.state.sum
    • 组件中修改vuex中的数据:$store.dispatch('action中的方法名',数据) $store.commit('mutations中的方法名',数据)

    getters的使用

    • 概念:当state中的数据需要经过加工后再使用时,可以使用getters加工
    • 在store.js中追加getters配置
    ......
    
    const getters = {
    	bigSum(state){
    		return state.sum * 10
    	}
    }
    
    //创建并暴露store
    export default new Vuex.Store({
    	......
    	getters
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 组件中读取数据:$store.getters.bigSum

    四个map方法的使用

    • mapState方法:用于帮助我们映射state中的数据为计算属性
    computed: {
        //借助mapState生成计算属性:sum、school、subject(对象写法)
         ...mapState({sum:'sum',school:'school',subject:'subject'}),
             
        //借助mapState生成计算属性:sum、school、subject(数组写法)
        ...mapState(['sum','school','subject']),
    },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • mapGetters方法:用于帮助我们映射getters中的数据为计算属性
    computed: {
        //借助mapGetters生成计算属性:bigSum(对象写法)
        ...mapGetters({bigSum:'bigSum'}),
    
        //借助mapGetters生成计算属性:bigSum(数组写法)
        ...mapGetters(['bigSum'])
    },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • mapActions方法:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数
    methods:{
        //靠mapActions生成:incrementOdd、incrementWait(对象形式)
        ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
    
        //靠mapActions生成:incrementOdd、incrementWait(数组形式)
        ...mapActions(['jiaOdd','jiaWait'])
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • mapMutations方法:用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数
    methods:{
        //靠mapActions生成:increment、decrement(对象形式)
        ...mapMutations({increment:'JIA',decrement:'JIAN'}),
        
        //靠mapMutations生成:JIA、JIAN(对象形式)
        ...mapMutations(['JIA','JIAN']),
    }
    
    //mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    模块化+命名空间

    • 目的:让代码更好维护,让多种数据分类更加明确
    • 修改store.js
    const countAbout = {
      namespaced:true,//开启命名空间
      state:{x:1},
      mutations: { ... },
      actions: { ... },
      getters: {
        bigSum(state){
           return state.sum * 10
        }
      }
    }
    
    const personAbout = {
      namespaced:true,//开启命名空间
      state:{ ... },
      mutations: { ... },
      actions: { ... }
    }
    
    const store = new Vuex.Store({
      modules: {
        countAbout,
        personAbout
      }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 开启命名空间后,组件中读取state数据:
    //方式一:自己直接读取
    this.$store.state.personAbout.list
    //方式二:借助mapState读取:
    ...mapState('countAbout',['sum','school','subject']),
    
    • 1
    • 2
    • 3
    • 4
    • 开启命名空间后,组件中读取getters数据:
    //方式一:自己直接读取
    this.$store.getters['personAbout/firstPersonName']
    //方式二:借助mapGetters读取:
    ...mapGetters('countAbout',['bigSum'])
    
    • 1
    • 2
    • 3
    • 4
    • 开启命名空间后,组件中调用dispatch
    //方式一:自己直接dispatch
    this.$store.dispatch('personAbout/addPersonWang',person)
    //方式二:借助mapActions:
    ...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
    
    • 1
    • 2
    • 3
    • 4
    • 开启命名空间后,组件中调用commit
    //方式一:自己直接commit
    this.$store.commit('personAbout/ADD_PERSON',person)
    //方式二:借助mapMutations:
    ...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),
    
    • 1
    • 2
    • 3
    • 4

    路由相关待完善

  • 相关阅读:
    thinkphp5 原生sql查询及取返回值
    反射在java框架中的应用
    ai文案工具有推荐吗?分享4个好用的工具!
    【AI】PyTorch入门(五):构建神经模型
    智能文件管理助手,轻松实现按数量平均分类文件,高效整理新文件夹!
    Flutter中的多线程如何使用
    已经导入java.io包,显示EOFException cannot be resolved to a type
    SpringBoot SpringBoot 原理篇 2 自定义starter 2.4 使用属性配置设置功能参数【1】
    PHP代码示例 - 创建、读取、增加、删除、修改 xml
    Sliver C2 实战 vulntarget-f
  • 原文地址:https://blog.csdn.net/WXY19990803/article/details/125707403