关于vue、vuex的一些初步小结

一、Vue组件的创建

一般语法:

Vue.component(tagName, options)
  • 务必在根组件实例化之前注册组件

组件options说明:

  • data: 必须是一个函数,目的在于返回独立的对象,保证组件之间的数据不互相影响
  • components: 局部注册一个组件,仅在当前组件作用域内可用
  • props: 用于父组件向子组件传递数据时使用,可传静态属性,也可传动态的(数据绑定,父组件数据变化引起子组件数据相应变化),一次性传递所有属性可采用v-bind指令
  • computed: 计算属性,在部分情况下可以代替watch的功能,也可用于:class的动态绑定
  • watch: 即属性侦听器,接受参数newData, oldData,含义顾名思义
  • methods: 定义组件内的方法
  • 生命周期函数:beforeCreate, created, beforeMount, mounted, updated, beforeDestroy, destroyed,其具体含义可参照官方文档

二、组件间数据传递

来看看文档里一段值得参考的语法(位置:组件-自定义事件-.sync修饰符):

<comp :foo="bar" @update:foo="val => bar = val"></comp>
  • :foo="bar"即父组件向子组件传递属性foo,vue中采用单向数据流,这里是为了让父组件的数据和数据的改动(若有的话)传递到子组件上,供子组件使用
  • update为vue生命周期函数,在数据变化前调用
  • 这里update部分事实上为v-on的缩写,作用是监听子组件中foo的改变并调用对应的处理器
  • 子组件向父组件发布事件(emit)会触发父组件设置的监听器(如果你设置了的话)

好了,这里涉及的概念可能比较多,所以再多解释一下吧~为了逻辑上更加清新,vue是不推荐子组件改变父组件的数据的,主要是出于维护成本的考虑,这就是所谓的单向数据流。父组件可以通过改变prop影响子组件数据,而子组件可以通过emit触发父组件方法。

但是,如果这样的数据传递不仅仅限于父子组件之间,而是祖先与后代组件或是兄弟组件呢?显然这会是一件很麻烦的事,为了处理这种多状态、多通信的情形,我们引入了vuex。

三、vuex的使用

如果你之前使用过flux、redux等状态状态管理工具的话,那么应该会很容易理解这个工具是要做什么~

下面依次介绍一下state、mutation和action这三个核心概念:

state

是一个持久化存储的状态,不归属于vue的某个特定组件,除非刷新页面,否则数据不会消失~

在根实例中注册store,下发到所有子组件,使用如下:

computed: {
  count () {
    return this.$store.state.count
  }
}

如果想要简化定义,使用mapState辅助函数就可,使用时从vuex引入该方法就可。

mutation

state的值不能直接被操作,想要改变它必须通过提交mutation的形式进行,方式为:

store.commit('something', payload)

注意一下第二个参数,这是以载荷形式提交参数,参数最多一个,想传多个参数的话必须以对象的形式提交。

mutation只能是同步函数,原因是devtool无法捕捉异步函数的快照。

action

为了执行异步操作,vuex引入了action来完成这一工作,调用方式是用dispatch方法,简化写法与state和mutation是类似的,值得看看的是将它和es6的promise和es7的async与await结合起来的工作原理:

actions: {
  actionA ({ commit }) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        commit('someMutation')
        resolve()
      }, 1000)
    })
  }
}

这个action返回了一个Promise对象,可以在后续进行处理,同时action中也可以调用其他异步action。

除了这三个概念外,还有getter(类比计算属性,用于从state派生出一些值)、module(分割较大的状态树,便于管理)。

处理表单可手动监听input、change或是使用带setter的双向绑定计算属性。


前端开发
我的前端学习之路
82 声望
2 粉丝
0 条评论
推荐阅读
BFF初探
在前后端联调时,有些麻烦出现的频率不低而且可能会较大程度影响开发效率,其中就包括前后端对接口数据格式设计的差异。两者一是基于领域模型,一是基于用户交互,因此设计出来的数据结构经常有差异,使得前端从...

太子长琴8阅读 9.2k

安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...

边城31阅读 7.2k评论 5

封面图
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...

chokcoco20阅读 2.1k评论 2

在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...

边城17阅读 1.9k

封面图
【已结束】SegmentFault 思否写作挑战赛!
SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等级,快来参与挑战,向更好的自己前进!

SegmentFault思否20阅读 5.6k评论 10

封面图
过滤/筛选树节点
又是树,是我跟树杠上了吗?—— 不,是树的问题太多了!🔗 相关文章推荐:使用递归遍历并转换树形数据(以 TypeScript 为例)从列表生成树 (JavaScript/TypeScript) 过滤和筛选是一个意思,都是 filter。对于列表来...

边城18阅读 7.7k评论 3

封面图
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...

原谅我一生不羁放歌搞文艺14阅读 19.9k评论 9

82 声望
2 粉丝
宣传栏