vue-cli + vue-router + vuex + axios单页小项目

介绍

项目的创建 创建一个练手的小项目,包含了自定义组件,vue-router,vuex,vue-axios的简单用法创建等。

主要模块

  • 路由的设置
  • 自定义组件的引入
  • vue-axios的使用方式
  • vuex实现组件间的通信

先看一下整体的项目,只要实现了列表请求网络接口进行展示以及详情页的展示,以及专题详情页与关于界面的通信。


00.gif

整体框架如下:

00.png
  • config文件夹中对项目文件进行设置
  • components 组件的文件夹
  • router 路由设置文件
  • store设置文件

路由的设置

npm install vue-router --save   

创建router文件夹饼创建index.js文件。main.js文件中进行设置


import router from './router'

// 设置路由跳转
Vue.prototype.$goRoute = function(index) {
  this.$router.push(index)
}

....其他代码

new Vue({
  el: '#app',
  router,  //设置路由
  store,   //设置store
  components: {
    App
  },
  template: '<App/>'
})


然后在index.js中设置路由跳转需要的设置,导入各个模块的头文件并进行设置

mport Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
....

Vue.use(Router)
// 根据引入的头文件设置路由信息
export default new Router({
  routes: [{
  //设置进入项目显示的根目录 然后根据需求 显示需求设置其他界面的路由设置
    path: '/',
    name: 'page00',
    component: page00
  },
 
 .....
   ]
})

在页面中调用

  <router-view></router-view>

然后在需要的地方调用 使用router-link 或者 $goRoute方法进行页面的路透跳转。

其中基本页面跳转和传值跳转的路由设置的举例

类似于Get请求的网址接口一样在路由网址中设置对应的参数字段来进行传值

{
    path: '/childrenpage01/:id',
    name: 'childrenpage01',
    component: childrenpage01
  },
  {
    path: '/page00',
    name: 'page00',
    component: page00
  },

可以看到在childrenpage01中可以传递相关的id到childrenpage01界面中

自定义组件的设置和引入

在项目的效果图中可以看到我们设置了一个头视图组委基础组件,具体实现如下:

<template>
  <div>
    <div class="zhihu-head">
        <div class="m1">知乎日报</div>
        <ul class="mt2">
            <li class="col">
                <router-link class="h5" to="/page00">日报</router-link>
            </li>
            <li class="col">
                <router-link class="h5" to="/page01">专题</router-link>
            </li>
            <li class="col">
                <router-link class="h5" to="/page02">关于</router-link>
            </li>
        </ul>
    </div>

 </div>
</template>

我们设置了头的显示并通过router-link设置了对应的界面跳转。
在需要显示的界面中直接引入头文件并直接导入自定义的组件文件

<template>
  <div class="page00">
    <BaseHead></BaseHead>
    <ul>
    .... 其他控件显示信息
     </ul>
    <router-view></router-view>

  </div>
</template>

<script >
import BaseHead from '@/components/baseHead'

export default {
  name: 'page00',
  data () {
    return {
    }
  } ,
   components: {
    //必须引入组件
        BaseHead
    }

}
</script>

vue-axios的使用介绍

引入网络请求
cnpm install axios

在config的index.js文件中修改

 dev: {
    env: require('./dev.env'),

    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {
      '/api': { // api为匹配项
        target: 'https://news-at.zhihu.com/api/4', // 设置代理目标
        changeOrigin: true,
        pathRewrite: { // 重写路径
          '^/api': '/'
        }
      }
    },

在main.js中引入axios 并设置baseURL

import axios from 'axios'

axios.defaults.baseURL = '/api/';

然后我们就可以去对应的页面做我们想要的网络请求了

mounted() {
    //do something after mounting vue instance
    this.getFocusLists()
  },
methods: {
    getFocusLists() {
      var vm = this;
      this.$http.get('/news/latest').then(function(res){
      .....
      //得到网络请求的数据信息
      })
      .catch(function (err) {
        console.log(err)
      })
    }
  },

在网络的开源项目中的有的在vuex中对axios的网络请求进行了封装通过store中设置的方法进行界面的刷新和数据的获取。这里我们只是在当前界面进行数据的请求和赋值。
界面的显示中进行数据的绑定并对整个cell实现点击事件跳转到详情页面

  <ul>
      <li v-for="item in focusList" :key="">
        <router-link :to="{name: 'childrenpage00', params: {id: item.id}}" tag="div">
          <!-- //这里改变tag="div" 渲染样式可以改变 router-link的激活状态 -->
        <!-- <img :src="item.images" alt=""> //图片网址加载不出来 -->
        <div class="content">
          {{item.title}}
        </div>
      </router-link>
      </li>
    </ul>

在router-link中我们可以看到通过params的形式对详情界面进行传值

<router-link :to="{name: 'childrenpage00', params: {id: item.id}}" tag="div">
....

</router-link>


由以上操作我们得到了如下显示界面

图01.png

并同理得到专题界面的数据进行展示

图02.png

在对应的详情页中我们同样使用axios 并根据首页中传递过来的id进行网络请求拿到数据后进行显示

<template>
  <div class="hello">
    <a @click="$goRoute('/page00')">返回上一级</a>
    <div v-html= "focusList" ></div>
    <router-view></router-view>
  </div>

</template>

通过$goRoute进行返回首页的操作,使用v-html来展示得到的html数据信息


图03.png

vuex实现组件间的通信

01.gif

如项目效果图01为了练习我们选择 使用专题详情页 与 关于界面之间进行数据传递,在专题的详情页进行数据输入,然后返回第一层级并切换到关于界面中接收数据

cnpm install vuex --save-dev

在个人的理解中store类似于iOS的单利,一个全局的事件管理类,我们可以通过store进行数据的赋值和取值来实现不同组件之间的通信,但是store并不能实现本地的存储,这个本地的存储指的是,如果我刷新了整个项目既相当于重新运行了整个vue项目之后,store中的数据并不能保留下来,如下动态图02 在关于界面我们获取到数据之后刷新界面,数据消失。

02.gif

如果使用store来保存登录状态,作用域仅在于当前项目中可以验证登陆状态,如果想保存在本地需要使用localStorage来保存数据
在store.js中

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
  // 定义状态
  state: {
    author: '数据还没来这是默认',
  }
 })

在数据赋值页面的提交事件里

  this.$store.state.author = this.inputText  //使用赋值的方式直接修改

关于界面中 直接取值这样就实现了最简单的界面之间的数据传递

<template>
  <div class="hello">
    <BaseHead></BaseHead>
    <p>    练习一把store</p>
    <div class=""> 来自远方的赋值: {{author}}   </div>
    <router-view></router-view>
  </div>

</template>

....
 computed: {
    author () {
       return this.$store.state.author   //初始方法
    }
  },
  
....

为了使用vuex我们设置他的其他属性如下

const store = new Vuex.Store({
  // 定义状态
  state: {
    author: '数据还没来这是默认',
    passWord: ''
  },
  mutations: {
    newAuthor (state, msg) {
      state.author = msg
    },
    newPassWord (state, msg) {
      state.passWord = msg
    }
  },
  actions: {
    newAuthor ({
      commit
    }, status) {
      commit('newAuthor', status)
    },
    newPassWord ({
      commit
    }, status) {
      commit('newPassWord', status)
    }
  },

  getters: {
    getAuthor (state) {
      return state.author
    },
    getPassWord (state) {
      return state.passWord
    }
  }

})

其实在简单的事件传递中我们并不需要actions ( actions 只是一个架构性的概念,并不是必须的),直接操作mutations就可以完成,比如专题页详情的赋值操作

setName: function () {
       this.$store.commit('newAuthor' ,this.inputText)  //官方推荐  这个是操作mutations
      alert('提交成功返回上一级去看看');
    }

vuex 真正限制你的只有 mutation 必须是同步的,使用actions可以执行异步操作,在actions执行完之后才进行下一个mutations。
actions方式赋值的使用方法如下:

setName: function () {
      this.$store.dispatch('newAuthor',this.inputText)
      alert('提交成功返回上一级去看看');
    }

getters只是获取其中的一个状态,提供一个获取状态的入口而已。调用方式如下

computed: {
    author () {
      // return this.$store.state.author   //初始方法
      return this.$store.getters.getAuthor  //获取到了 数值  
    }
  }

这样我们就实现了界面的组件通信。

后记

第一个Vue项目练手,目的是熟悉一下vue的写法以及一些组件的使用和配置方式,希望接下来写出更靠谱的vue小项目。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容

  • 1.关于学习:①《秘密》50页,不得不说,堪称一本神书,不断刷新认知,心之所向,物之所至。②雅思单词1个单元。③邵...
    牛欢Vincent阅读 106评论 0 0
  • 有一天去流浪 有一天会当一名流浪歌手 去天南地北流浪 在街头上唱上歌 在天桥上弹着吉他 有时去酒吧驻唱 更多在夜场...
    御姐姐不是人生阅读 75评论 0 1
  • 1. 第十期早起训练营已经一周了,这次的打卡模式 和上期有所“精进”,虽然繁琐了些,每个细节却也看的出用意。队长丫...
    即刻行动阅读 212评论 0 0