vue2-3随笔 组件化/脚手架2


1.Vue封装的过度与动画

  作用:在插入、更新或移除 DOM元素时,在合适的时候给元素添加样式类名。

  使用:

   1. 准备好样式:

    - 元素进入的样式

      1. v-enter:进入的起点 

      2. v-enter-active:进入过程中

      3. v-enter-to:进入的终点

    - 元素离开的样式:

      1. v-leave:离开的起点

      2. v-leave-active:离开过程中

      3. v-leave-to:离开的终点

   2. 使用``````包裹要过度的元素,并配置name属性:name属性与前文中样式名中的v相同  例如  ‘name’-leave

   3. 备注:若有多个元素需要过度,则需要使用:``````,且每个元素都要指定```key```值。

2.跨域问题的解决:代理服务器

  在vue.config.js中添加如下配置:devServer:{proxy:"http://localhost:5000}

    1. 优点:配置简单,请求资源时直接发给前端(8080)即可。

    2. 缺点:不能配置多个代理,不能灵活的控制请求是否走代理。

    3. 工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器 (优先匹配前端资源)

  其二: 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

    优点:可以配置多个代理,且可以灵活的控制请求是否走代理。

    缺点:配置略微繁琐,请求资源时必须加前缀。

3.插槽的使用:slot

  作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 父组件 向 子组件,共三种默认插槽、具名插槽、作用域插槽

  默认插槽:

    父组件中:    

html结构1
   

    子组件中:  <template>  

     插槽默认内容...  
  template>

  具名插槽:

    父组件中:<Category>   <template slot="center">   

html结构1
    template>   <template v-slot:footer>   
html结构2
   template>   Category>

    子组件中:<template>    <div>        插槽默认内容...    插槽默认内容...   div>    template>

  作用域插槽:

    1. 理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。(games数据在Category组件中,但使用数据所遍历出来的结构由App组件决定)

    2. 具体编码:

      父组件中:<Category>   <template scope="scopeData">      <ul>      {{g}}     ul> template>Category>

             <Category>   <template slot-scope="scopeData">      <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>

4.状态管理器Vuex

  概念:在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。

  (1)创建文件

    import Vue from 'vue'    

    import Vuex from 'vuex'       

    Vue.use(Vuex)         

    const actions = {}  //响应组件中用户的动作,分发任务给actions或mutations

    const mutations = {}  //修改state中的数据

    const state = {}   //存储数据

    const getters = {}  //获取数据

    export default new Vuex.Store({

      actions,  mutations, state ,getters  })   //创建并暴露store

  (2)在main.js中引入

    import store from './store'

    new Vue({

      el:'#app',

      render: h => h(App),

      store })

  (3)简单读取state中的数据 :  $store.state.sum

      需要对读取的数据进行处理:     $store.getters.bigSum(函数名)  

      简单修改state中的数据:        $store.commit('mutations中的方法名',数据)

      当修改的流程相对复杂,设计逻辑判断:   $store.dispatch('action中的方法名',数据)  ,然后由actions再向mutations发送任务

  (4)Vuex的四个map

    ...mapState/mapGetters/mapActions/mapMutations  ({sum:'sum',school:'school',subject:'subject'}),

    ...mapState/mapGetters/mapActions/mapMutations(['JIA','JIAN'])

    备注:mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象。

  (5)自命名空间

    书写形式:

      const countAbout = {

        namespaced:true,//开启命名空间

        state:{x:1},

        mutations: { ... },

        actions: { ... },

        getters: { ... }   }

      // 省略 personAbout   

      const store = new Vuex.Store({

        modules: {

          countAbout,   personAbout   }   })

    使用变化

      (1)state:  this.$store.getters['personAbout/firstPersonName']        //  另一种写法     ...mapGetters('countAbout',['bigSum'])

      (2)getters:   this.$store.getters['personAbout/firstPersonName']     //  ...mapGetters('countAbout',['bigSum'])

      (3)actions/mutations:  this.$store.dispatch('personAbout/addPersonWang',person)     // ...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

相关