Vue学习(1)vue模板-vuex简介

本文深入探讨了Vuex的核心概念,包括State、Getters、Mutations和Actions,并提供了实际应用场景和示例代码。

Vuex 学习总结

好在之前接触过 flux,对于理解 vuex 还是很有帮助的。react 学到一半,后来因为太忙,就放弃了,现在也差不多都忘记了。不过感觉 vuex 还是跟 flux 还是有点区别的。

 

对于很多新手来说,只是阅读文档是不好消化,我的建议是看看 vuex 的实例,通过研究实例来学习vuex。这样就会好理解多了。如果还是不能理解,最好办法就是先把store 的四个属性:state, getters, mutations, actions 记下来,然后再分析四个属性的特点,什么地方会用到,是怎样连接在一起的?通过这样问自己问题来进行学习。

 

简单来说,vuex 就是使用一个 store 对象来包含所有的应用层级状态,也就是数据的来源。当然如果应用比较庞大,我们可以将 store 模块化,也就是每个模块都有自己的 store。分割方式见如下的代码:

从上面的代码我们也可以看出,一个 store 有四个属性:state, getters, mutations, actions。下面我将从这四个属性开始讲。

 

1、State

先来讲state。state 上存放的,说的简单一些就是变量,也就是所谓的状态。没有使用 state 的时候,我们都是直接在 data 中进行初始化的,但是有了 state 之后,我们就把 data 上的数据转移到 state 上去了。当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键:

其实就是把 state 上保存的变量转移到计算属性上。当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组。

computed: mapState([
  // 映射 this.count 为 store.state.count
  'count'
])

 为了更好地理解这个函数的作用,我们可以看看它的源代码。

可以看到,mapstate 即可以接受对象,也可以接受数组。最终返回的是一个对象。并且 res[key] 的值都是来于 store 里的,红色那条代码就是。这样就把两个不相关的属性连接起来了,这也是映射。其他几个辅助函数也是类似的。

 

2、Getters

getters上简单来说就是存放一些公共函数供组件调用。getters 会暴露为 store.getters 对象,也就是说可以通过 store.getters[属性]来进行相应的调用。mapGetters 辅助函数仅仅是将 store 中的 getters 映射到局部计算属性,其实也就是从 getters 中获取对应的属性,跟解构类似。具体如下图 
这样我们就可以将 getters 中的 evenOrOdd 属性值传给对应组件中的 evenOrOdd 上。Getters 接受 state 作为其第一个参数,Getters 也可以接受其他 getters 作为第二个参数。

3、Mutations

mutations 与事件类似,更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。所以 mutations 上存放的一般就是我们要改变 state 的一些方法。

复制代码
复制代码
const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 变更状态
      state.count++
    }
  }
})
复制代码
复制代码

 

我们不能直接调用一个 mutation handler。这个选项更像是事件注册:“当触发一个类型为 increment 的 mutation 时,调用此函数。”要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法:

store.commit('increment')

 

当 mutation 事件类型比较多的时候,我们可以使用常量替代 mutation 事件类型。同时把这些常量放在单独的文件中可以让我们的代码合作者对整个 app 包含的 mutation 一目了然:

一条重要的原则就是要记住 mutation 必须是同步函数

4、Actions

前面说了,mutation 像事件注册,需要相应的触发条件。而 Action 就那个管理触发条件的。

Action 类似于 mutation,不同在于:Action 提交的是 mutation,而不是直接变更状态。Action 可以包含任意异步操作。 

actions: {
    increment (context) {
      context.commit('increment')
    }
  }

 

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。
实践中,我们会经常会用到 ES2015 的 参数解构 来简化代码(特别是我们需要调用 commit 很多次的时候):

actions: {
  increment ({ commit }) {
    commit('increment')
  }
}

 

还记得我们前面说过 mutation 像事件类型吗?因此需要我们给定某个动作来进行触发。而这就是分发 action。Action 通过 store.dispatch 方法触发:

store.dispatch('increment')

 

此外,我们还可以在我们可以在 action 内部执行异步操作:

复制代码
复制代码
actions: {
  incrementAsync ({ commit }) {
    setTimeout(() => {
      commit('increment')
    }, 1000)
  }
}
复制代码
复制代码

 

你在组件中使用 this.$store.dispatch('xxx') 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在根节点注入 store):

复制代码
复制代码
import { mapActions } from 'vuex'

export default {
  // ...
  methods: {
    ...mapActions([
      'increment' // 映射 this.increment() 为 this.$store.dispatch('increment')
    ]),
    ...mapActions({
      add: 'increment' // 映射 this.add() 为 this.$store.dispatch('increment')
    })
  }
}
复制代码
复制代码

 

这句话意思其实是,当你使用了 mapActions, 你就不需要再次使用 this.$store.dispatch('xxx'),当你没使用的话,你可以需要手动去分法。比如下面的代码:

 

什么时候用this.$store.dispatch('xxx'),什么时候用 mapActions 大家要根据情况而定的。

本文转自 http://www.cnblogs.com/libin-1/p/6518902.html

Html Webpack Plugin: Error: Child compilation failed: Module not found: Error: Can't resolve 'C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\html-webpack-plugi n\lib\loader.js' in 'C:\码\Vue\136Vue状态管理核心\vue-vuex-demo' ModuleNotFoundError: Module not found: Error: Can't resolve 'C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modul es\html-webpack-plugin\lib\loader.js' in 'C:\码\Vue\136Vue状态管理核心\vue-vuex-demo' at C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\webpack\lib\Compilation.js:2123:28 at C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\webpack\lib\NormalModuleFactory.js:923:13 at eval (eval at create (C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\tapable\lib\HookCodeFactory.j s:33:10), :10:1) at C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\webpack\lib\NormalModuleFactory.js:339:22 at eval (eval at create (C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\tapable\lib\HookCodeFactory.j s:33:10), :9:1) at C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\webpack\lib\NormalModuleFactory.js:520:22 at C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\webpack\lib\NormalModuleFactory.js:155:10 at C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\webpack\lib\NormalModuleFactory.js:745:23 at C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\neo-async\async.js:2830:7 at done (C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\neo-async\async.js:2925:13) at C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\webpack\lib\NormalModuleFactory.js:1188:10 at finishWithoutResolve (C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\enhanced-resolve\lib\Resolver .js:567:11) at C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\enhanced-resolve\lib\Resolver.js:656:15 at C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\enhanced-resolve\lib\Resolver.js:718:5 at eval (eval at create (C:\码\Vue\136Vue状态管理核心\vue-vuex-demo\node_modules\tapable\lib\HookCodeFactory.j s:33:10), :1
03-18
<think>好的,我现在需要解决用户在Webpack编译时遇到的错误,具体是HtmlWebpackPlugin子编译失败,提示ModuleNotFoundError,涉及webpack、vuevuex-demo、html-webpack-plugin和loader.js。用户希望找到解决方案。 首先,我应该回忆一下常见的Webpack构建错误。ModuleNotFoundError通常是因为模块路径不正确或者模块未安装。HtmlWebpackPlugin的问题可能与其配置或模板文件有关。用户提到vue-vuex-demo,可能是在Vue项目中使用了Vuex,但问题更可能与Webpack配置相关。 根据用户提供的引用资料,特别是引用[2]和引用[4],用户可能在配置vue.config.js时涉及到了HtmlWebpackPlugin的设置。引用[2]中的代码展示了如何修改configureWebpack来访问HtmlWebpackPlugin的实例,可能用户在调整模板参数时出现了问题。另外,引用[4]提到从Vue2升级到Vue3时webpack和vue-loader的配置变化,可能用户升级了项目导致兼容性问题。 接下来,我需要逐步分析可能的原因: 1. **依赖安装问题**:检查是否安装了html-webpack-plugin及其相关loader的版本是否兼容。Vue3可能需要更高版本的插件,而旧版本可能不兼容,导致模块找不到。 2. **模板文件路径错误**:HtmlWebpackPlugin通常需要一个模板文件(如index.html),如果路径配置错误,会导致子编译失败。需要确认template选项的路径是否正确。 3. **loader配置缺失**:如果模板文件中引用了需要处理的资(如图片、CSS),而相应的loader没有正确配置,可能导致模块找不到。例如,处理HTML中的图片可能需要file-loader或url-loader。 4. **Vue-loader版本问题**:升级到Vue3需要对应的vue-loader版本,旧版可能不兼容,导致解析.vue文件时出错,从而影响HtmlWebpackPlugin的处理。 5. **缓存问题**:有时候旧的构建缓存可能导致问题,清除node_modules/.cache或dist目录后再重新构建可能有效。 然后,根据这些可能的原因,逐一给出解决方案: - 检查html-webpack-plugin和vue-loader的版本,确保与Vue3兼容。例如,Vue3需要vue-loader@16以上,而html-webpack-plugin可能需要最新版本。 - 确认模板路径是否正确,在vue.config.js中检查是否指定了正确的template文件路径,例如public/index.html是否存在。 - 检查是否有必要的loader来处理模板中的资,例如在webpack配置中添加处理HTML中资的规则。 - 清除缓存,重新安装依赖,再尝试构建。 此外,引用[3]提到dev-server.js启动时会加载配置,可能配置中存在错误。需要检查webpack的配置文件是否有语法错误或路径错误。 最后,确保用户按照Vue3的升级指南调整了所有相关的配置,包括webpack.base.conf.js等文件中的vue-loader配置,以及可能的插件更新。例如,在Vue3中,需要引入VueLoaderPlugin,并正确配置rules来处理.vue文件。</think>针对Webpack编译时出现`HtmlWebpackPlugin child compilation failed`及`ModuleNotFoundError`的问题,以下是分步解决方案: --- ### 1. 检查依赖版本兼容性 **原因**:Vue3项目需要匹配的`html-webpack-plugin`、`vue-loader`和`webpack`版本,版本冲突会导致模块解析失败。 **操作步骤**: - 在`package.json`中确保依赖版本满足以下要求: ```json "dependencies": { "vue": "^3.0.0", "vue-loader": "^16.0.0", "html-webpack-plugin": "^5.0.0" }, "devDependencies": { "webpack": "^5.0.0" } ``` - 执行`npm install`或`yarn install`更新依赖。 --- ### 2. 验证模板文件路径 **原因**:`HtmlWebpackPlugin`默认从`public/index.html`加载模板,若路径错误会触发子编译失败。 **操作步骤**: - 在`vue.config.js`中显式指定模板路径(即使使用默认配置): ```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { configureWebpack: { plugins: [ new HtmlWebpackPlugin({ template: './public/index.html' // 确认路径存在 }) ] } }; ``` - 检查`public/index.html`是否存在,并确保无语法错误[^2]。 --- ### 3. 配置Loader处理模板 **原因**:若模板中引用了图片、CSS等资,需配置对应Loader。 **操作步骤**: - 在`webpack.base.conf.js`中添加资处理规则: ```javascript module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, use: [{ loader: 'file-loader' }] }, { test: /\.html$/i, use: 'html-loader' // 处理HTML中的资引用 } ] } ``` --- ### 4. 升级VueLoaderPlugin配置 **原因**:Vue3必须使用`@vue/compiler-sfc`和`VueLoaderPlugin`。 **操作步骤**: - 安装必要依赖: ```bash npm install @vue/compiler-sfc -D ``` - 在`webpack.base.conf.js`中引入插件: ```javascript const { VueLoaderPlugin } = require('vue-loader'); module.exports = { plugins: [new VueLoaderPlugin()] }; ``` --- ### 5. 清除缓存并重新构建 **原因**:Webpack缓存可能导致旧配置残留。 **操作步骤**: ```bash rm -rf node_modules/.cache/dist # 清除缓存 npm run build # 重新构建 ``` --- ### 示例配置片段 ```javascript // vue.config.js const { defineConfig } = require('@vue/cli-service'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const { VueLoaderPlugin } = require('vue-loader'); module.exports = defineConfig({ configureWebpack: { plugins: [ new VueLoaderPlugin(), new HtmlWebpackPlugin({ template: './public/index.html' }) ] } }); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值