2/3 初次搭建 Vue 项目遇到的问题汇总

  今天步子扯开的有点大

  初步看了一下 Vue-router 然后就开始用脚手架 Vue-cli 来搭建第一个项目了

  遇到的问题确实很多,还有一些疑问,自己查资料都大致解决了一部分

  ( 推荐还是理解了一部分的有缘人 进行阅读理解 如果有错 请大家指正 )

  按照流水账来说一下 首先是

Vue-router 

  这里先简单谈一下,我的理解

     根据 url 来 相应不同的组件 以达到 SPA 的效果 ( Single Page Application )

  这有一例实例代码

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4   <title></title>
 5 </head>
 6 <body>
 7 <script src="https://unpkg.com/vue/dist/vue.js"></script>
 8 <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
 9 <div id="app">
10   <ul>
11     <li><router-link to="/">Home</router-link></li>
12     <li>
13       <div><router-link to="/about">About</router-link></div>
14       <ul>
15         <!-- 3. 使用嵌套路由 -->
16         <li><router-link to="/about/author">About - Author</router-link></li>
17         <li><router-link to="/about/email">About - Email</router-link></li>
18       </ul>
19     </li>
20   </ul>
21   <router-view></router-view>
22 </div>
23 <script type="text/javascript">
24   let Home = { template: '<h1>This is Home!</h1>' } // Home组件
25   let About = { // About组件
26     template: '<div>' + 
27     '<h1>This is About!</h1>' + 
28     '<router-view></router-view>' +  // 1. 嵌套的动态视图区
29     '</div>'
30   }
31   let Author = { template: '<p>Author: lonelydawn</p>' } // Author组件
32   let Email = { template: '<p>Email: lonelydawn@sina.com</p>' } // Email组件
33   let routes = [ // 定义路由规则, 每一个路由规则应该映射一个视图组件
34     { path: '/', component: Home }, // compoent 就是对应 path 的展示的组件
35     { 
36       path: '/about', 
37       component: About,
38       children: [ // 2. 嵌套子路由
39         { path: 'author', component: Author },
40         { path: 'email', component: Email }
41       ]
42     }
43   ]
44   let router = new VueRouter({ // 创建VueRouter实例, 并传入routes配置
45     routes
46   })
47   let app = new Vue({
48     router
49   }).$mount('#app')
50 </script>
51 </body>
52 </html>

  其实就是

    " / " 对应的是 组件 home 

    " /about " 对应的是 组件 About

      " /about/author " 对应的是 组件 Author

      " /about/email " 对应的是 组件 Email

  都是调用关系

Vue-cli

  刚才写的一大堆没了

  简单写一下

  1.打开控制台输入

    cnpm install vue-cli -g

  2.查看是否安装成功

    vue  --version

  3.进入想放置的文件目录 初始化项目

    vue init webpack my-project

      (  推荐不选择 ESlint 然后是 unit test 和 e2e 不选 )

  4.还是想放置的目录 进行安装项目依赖

    cnpm install 

  5.构建开发版本 ( 按照提示打开浏览器查看 )

    npm install 

  6.再打开一个控制台 进行构建生产版本

    npm run build

  这里主要的问题就是没有选择目录创建,一直找不到依赖 ( 我也没装 ) 

  之后把项目放到 VScode 里面就成功了

 Vuex

  承接上文,我们如果想安装状态控制的话

  7.还是在原来的目录

    cnpm install  vuex --save-dev

  8.创建相应的文件夹文件( 创建 store 文件夹 )

       

    index.js 是出口 引用了 modules 里面的每一个模块 ( counter 、 test )

  依据 counter 的例子进行梳理

 1 export default {
 2     namespaced: true,
 3     state: {
 4         count: 0
 5     },
 6     getters: {
 7         tenTimesCount (state, getters, rootState, rootGetters) {
 8             console.log(state, getters, rootState, rootGetters)
 9             return state.count * 10
10         }
11     },
12     mutations: {
13         addCount (state,num) {
14             state.count += num || 1
15         }
16     },
17     actions: {
18         addCountAsync (context,num) {
19             setInterval(() => {
20                 if (context.state.count < 2000) {
21                     context.commit('addCount', num || 100)
22                 }
23             }, num || 100);
24         }
25     }
26 }
counter.js

  在看书的时候,对于模块 counter 中的这一部分有些疑问,书上没有解释清楚

  

   起初,对于绿色这一部分,我是不知道怎么来的,也没有定义过,经过看官网资料,发现,这个参数是默认的,后面的参数 ( 红色 )

  被叫做 提交载荷

  

  同理 Actions 的 context  也是如此

  

   然后就是我们的额外参数

  

   这个问题搞清楚之后,又来了一个 

  

   在vue组件引用的时候,

   中间看不懂

  看了很多博客才明白

    mapState 辅助函数 相当于 将 某个 组件的 state 的属性给 构造 出来  返回一个对象

  依次类推

  ........

  我们可以这样理解

    mapState ( ["count"] ) 返回的是 { count ( ) { return this.$store.state.count } } 一个对象
    所以,辅助函数会方便我们来进行操作,比如直接
 
    computed : mapState ( ["count"] )
    就相当于
    computed : {
      count ( ) { return this.$store.state.count }
     }
 

  但是返回的终究是 一个对象  如果我想再添点其他的属性,就没法了

  这个时候,就可以利用 ES6 的新特性

  对象展开运算符  ... 

    一个例子 [ ... [ 1, 2, 3 ] ,4 ,5 ] 为 [ 1,2,3,4,5]

    

   依照这个,我们可以

  

   ( 只是举一个例子 )

  然后是补充的一个问题,因为发现 getters 的默认参数有点神奇, 于是做了一些研究

  就是加了一个 test 模块

  

   原来的 counter  模块

  

   然后查看 console

  

   其实这里就发现了,rootState 其实就是 index.js 输出 js 的这个对象( module ) ,rootGetters 其实就是这个 module 对象的属性 getters 集合的一个对象 

  


总结

  还是看起来打脑壳,只要看懂了还好

  但是不是很深入地去了解

  继续加油

    

Let it roll
原文地址:https://www.cnblogs.com/WaterMealone/p/14370420.html