day48(vueJS)模块化管理状态 辅助函数 / 映射函数 sass库

vuejs模块化管理 辅助函数 / 映射函数 sass库

1.模块化管理状态

1.1要点总结

1. 步骤:(模块化管理状态强调模块化开发思想)
  1. 按照state中不同的数据,将getters,mutations,actions,state中的内容拆分,组成单个对象,放入不同的js文件并导出,每个文件代表一条数据的管理模块(modules和plugins只能写在vuex实例化的入口文件,单数据管理模块不需要这两部分,这些单个的管理模块只需要getters,mutations,actions,state四部分即可)
  2. 将放置数据的js文件分别导入回vuex实例化的入口文件中,并在modules对象中注册,入口文件中保留getters,mutations,actions,state这四个部分,但空置不写内容
  3. 在每条数据的整合对象中加入namespaced:true;这条语句,代表开启模块化
2. 使用:(开启模块化之后state数据,同步异步方法和计算方法的获取与调用方式与未开启模块化不同)
  1. 同步异步方法的触发:
    1. this.$store.commit('模块名/触发的同步方法名',传入参数);
    2. this.$store.dispatch('模块名/触发的异步方法名',传入参数);
  2. state数据的获取:
    1. this.$store.state.模块名.数据名;
  3. 计算方法的获取:
    1. this.$store.getters['模块名/方法名'];

2.2代码演示

vuex入口文件.js(vuex实例化的文件)
import { createStore,createLogger } from 'vuex'
import historylist from './modules/historylist'-----导入拆分出去的模块
import tasklist from './modules/tasklist'
export default createStore({-----实例化vuex
    state:{ ----------存储数据

    },
    getters:{ ----------定义计算方法( 类似于组件中的计算属性 )

    },
    mutations:{ ------------定义同步方法
        
    },
    actions:{ ------------定义异步方法

    },
    modules:{ --------------以模块化的方式管理state中的数据
        hl:historylist,
        tl:tasklist
    },
    plugins:[ -----------集成第三方插件 来管理state中的数据
        createLogger()
    ] 
})
historylist这条数据的管理模块(这是一个js文件( 模块 ) , 负责管理historylist这个数据)
export default {---------将该条数据与其相关方法整合到一个对象中并导出
    namespaced:true,-----------该属性开启模块化
    state:{ ----------存储数据
        historylist:[],
    },
    getters:{ ------------定义计算方法( 类似于组件中的计算属性 )
      
    },
    mutations:{ ---------------定义同步方法
        addHistory( state, payload ){------------新增历史记录
            state.historylist.push(payload);
        }
    },
    actions:{ --------------定义异步方法

    }
}
tasklist这条数据的管理模块 (这是一个独立的js文件( 模块 ), 单独管理tasklist这个数据)
export default {
    namespaced:true,---------------开启模块化
    state:{ -----------存储数据
        tasklist:[ /* { id:1, name:'', status:false } */ ]
    },
    getters:{ -----------定义计算方法( 类似于组件中的计算属性 )
        totalCount(state){-------------统计任务总数
            return state.tasklist.length;
        },
        finishedCount(state){----------统计已完成任务数量
            return state.tasklist.filter(item=>item.status).length;
        },
        unfinishedCount(state){--------统计未完成任务数量
            return state.tasklist.filter(item=>!item.status).length;
        }
    },
    mutations:{ ---------------定义同步方法
        addTask( state, payload ){----------新增任务
            if( payload ){
                var obj = { id: state.tasklist.length + 1 ,name: payload, status:false  };-----构造一个新的任务对象
                state.tasklist.push( obj );--------添加新的任务对象 到任务列表中
            }
        },
        changeTaskStatus( state, payload ){---------------更改任务状态
            var task = state.tasklist.find( item=>item.id == payload );--------根据id 找到需要更改状态的任务对象
            if( task ){----------更改任务对象的状态
                task.status = !task.status;
            }
            console.log( task,payload );
        },
        deleteTask( state, payload ){---------------删除任务
            var i = state.tasklist.findIndex(item=>item.id == payload);-------根据id找到 需要删除的元素位置(下标)
            if( i != -1 ){------------------删除对应位置的任务对象
                state.tasklist.splice(i,1);
            }
        }
    },
    actions:{ ------------------------定义异步方法
    }
}

模块化方法的使用
组件内
export default {
    data(){
        return {
            taskname:''
        }
    },
    methods:{
        handleAdd(){
            this.$store.commit('tl/addTask', this.taskname );-----------触发同步方法(调用同步方法),在触发方法名前加上模块名/
            this.$store.commit('hl/addHistory', this.taskname );---------触发同步方法(调用同步方法)
            this.taskname = '';-----------清空输入框的值
        }
    }
}
模块化计算方法的使用
<template>
  <div class="summary">
    <span>全部( {{ $store.getters['tl/totalCount'] }} )</span>------------调用方法:$store.getters['模块名/方法名']
    <span>已完成( {{ $store.getters['tl/finishedCount'] }} )</span>
    <span>未完成( {{ $store.getters['tl/unfinishedCount'] }} )</span>
  </div>
</template>
模块化数据的使用
<template>
  <div class="tasklist">
动态渲染任务列表( 从vuex中获取 )
    <div class="task" v-for="(item,index) in $store.state.tl.tasklist" :key="index">--------模块化之后只需要多加一个模块名即可:$store.state.模块名.计算方法名
        <div class="left">
            <input type="checkbox" :checked="item.status" @click="handleClick(item.id)">
            <span>{{item.name}}</span>
        </div>
        <span @click="handleDelete(item.id)">删除</span>
    </div>
   
  </div>
</template>

2.辅助函数/映射函数

2.1.要点总结—

概念与作用:映射函数又称辅助函数,是vuex提供的方法,主要用于简化组件内使用到vuex中数据是多次重复的this.$store,降低代码冗余。
原理:映射函数将简化后的写法转化成原本调用vuex实例内数据和方法的标准语法然后执行,这就是映射的过程
语法:(映射的功能相当于直接在methods与computed中定义目标方法)
未模块化时
同步方法:methods:{...mapMutations(["同步方法名","同步方法名","同步方法名",.....])}
异步方法:methods:{...mapActions(['异步方法名','异步方法名','异步方法名',....])}
state数据:computed:{...mapState(['数据名','数据名','数据名',......])}
计算方法:computed:{...mapGetters(['计算方法名','计算方法名','计算方法名',.....])}
模块化时
同步方法:methods:{...mapMutations('模块名',["同步方法名","同步方法名","同步方法名",.....])}
异步方法:methods:{...mapActions('模块名',['异步方法名','异步方法名','异步方法名',....])}
state数据:computed:{...mapState('模块名',['数据名','数据名','数据名',......])}
计算方法:computed:{...mapGetters('模块名',['计算方法名','计算方法名','计算方法名',.....])}

2.2.代码演示—

<template>
  <div class="summary">
    <span>全部( {{ totalCount }} )</span>------计算方法使用方式类似于组件内的计算属性
    <span>已完成( {{ finishedCount }} )</span>
    <span>未完成( {{ unfinishedCount }} )</span>
  </div>
</template>

<script>
从vuex导入 辅助函数(映射函数)
import { mapGetters } from 'vuex';-------mapGetters() 从vuex中获取(映射)计算方法到组件的computed中
export default {
  computed:{
    ...mapGetters('tl',['totalCount','finishedCount','unfinishedCount'])----------调用方法,在方法前添加扩展运算符,因为该方法调用返回一个对象,需要将对象内的方法展开才能使用。该方法在模块化时接受两个参数,第一个参数时方法对应的模块名,第二个参数是罗列方法名的数组;
  }
}
</script>
<template>
  <div class="tasklist">
    <div class="task" v-for="(item,index) in tasklist" :key="index">------使用映射函数之后的state数据可以直接使用在组件模板中
        <div class="left">
            <input type="checkbox" :checked="item.status" @click="handleClick(item.id)">
            <span>{{item.name}}</span>
        </div>
        <span @click="handleDelete(item.id)">删除</span>
    </div> 
  </div>
</template>

<script>
从vuex导入 辅助函数(映射函数)
import { mapMutations,mapState } from 'vuex';------mapState() 从vuex中获取(映射)state到组件的computed中
export default {
    computed:{
        ...mapState('tl',['tasklist'])
    },
    methods:{
        ...mapMutations('tl',['changeTaskStatus','deleteTask']),
        handleClick(id){
            this.changeTaskStatus(id);----------使用映射函数之后可以直接调用映射过的方法
        },
        handleDelete(id){
            this.deleteTask(id);
        }
    }
}
</script>

3.sass库

3.1.要点总结–

sass库:一种用于优化css样式中选择器嵌套冗余代码的插件,他可以优化样式代码选择器嵌套冗余,并且能够体现标签的嵌套关系
Sass(Syntactically Awesome Style Sheets)是一种 CSS 预处理器,它在 CSS 的基础上增加了许多功能和特性,使得 CSS 更加强大、灵活和易于维护。
作用:
  1. Sass 支持嵌套规则,可以减少 CSS 代码的层级,让代码更加清晰易读;
  2. Sass 支持变量、函数和表达式,可以方便地定义和使用样式参数;
  3. Sass 支持继承和混合,可以将一些常用的样式定义成可复用的模板,提高代码的效率和可维护性;
  4. Sass 支持模块化和导入,可以将样式文件分成多个模块,方便管理和维护;
  5. Sass 支持条件语句和循环语句,可以根据不同的条件生成不同的样式;
  6. 简化 CSS 开发,提高开发效率;
  7. 提高 CSS 代码的可读性和可维护性;
  8. 方便地定义和使用样式参数,提高代码的灵活性;
  9. 可以将样式文件分成多个模块,方便管理和维护;
使用步骤:
  1. 指令:npm i sass
  2. 在组件内的style标签上添加:lang='scss';这条语句,注意属性值是scss而不是sass,因为使用scss可以时样式语句高亮更明显,易于检查错误,sass高亮不太明显
1. 支持
  1. 选择器嵌套
  2. 定义变量,变量可以进行加减乘除运算,在sass中所有变量以$开头,冒号后面写值,css中的宽高内外间距和边框等都可以用变量给值
  3. 支持定义函数,所有的指令前面需要加上@,比如@function函数指令,@return返回指令,
  4. 支持条件语句ifelse if5. 支持for循环语句。

3.2.代码演示–

<style scoped lang='scss'>
$p:10px;------------定义变量, 变量可以进行加减乘除运算
@function calcNum( $param ){------------定义函数
    @return $param * 2;
}
选择器嵌套
.input-box{
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: $p;
    input{
        height: $p*4;
        outline: none;
        border-radius: $p/2;
        border: 1px solid #ccc;
        padding-left: calcNum($p);-------------------调用函数
        flex:1;
    }
    span{
        width: $p*6;
        text-align: center;
    }
}
</style>
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值