Vue实现页面导航实战

亦凉 2021-07-24 22:36 817阅读 0赞

目录

一 使用技术栈

二 创建项目

三 准备资源文件

四 安装axios

五 代码

六 测试

七 源码参考


一 使用技术栈

1 组件及组件间传值

2 axios实现读取json数据:商品数据源存于json中

3 css相关技术进行布局:布局、间距等样式

4 使用views页面级组件,使用router设置页面

二 创建项目

1 创建项目

  1. F:\vue\proj>vue create proj

2 选择必要组件

  1. ? Check the features needed for your project:
  2. (*) Babel
  3. ( ) TypeScript
  4. ( ) Progressive Web App (PWA) Support
  5. (*) Router
  6. ( ) Vuex
  7. ( ) CSS Pre-processors
  8. >( ) Linter / Formatter
  9. ( ) Unit Testing
  10. ( ) E2E Testing

3 选择history模式

  1. ? Use history mode for router? (Requires proper server setup for index fallback in production) (Y/n) y

4 选择使用package.json来记录

  1. ? Where do you prefer placing config for Babel, ESLint, etc.? In package.json

5 选不保存为预制项目

  1. ? Save this as a preset for future projects? (y/N) n

6 开始安装

7 运行

  1. cd proj
  2. npm run serve

三 准备资源文件

1 准备图片

20200822151606910.png

2 准备json文件

bjb.json

  1. [
  2. {
  3. "goodName": "联想笔记本",
  4. "img": "img/bjb/bjb1.jpg"
  5. },
  6. {
  7. "goodName": "联想笔记本",
  8. "img": "img/bjb/bjb2.jpg"
  9. },
  10. {
  11. "goodName": "联想笔记本",
  12. "img": "img/bjb/bjb3.jpg"
  13. },
  14. {
  15. "goodName": "联想笔记本",
  16. "img": "img/bjb/bjb4.jpg"
  17. },
  18. {
  19. "goodName": "联想笔记本",
  20. "img": "img/bjb/bjb5.jpg"
  21. },
  22. {
  23. "goodName": "联想笔记本",
  24. "img": "img/bjb/bjb6.jpg"
  25. },
  26. {
  27. "goodName": "联想笔记本",
  28. "img": "img/bjb/bjb7.jpg"
  29. },
  30. {
  31. "goodName": "联想笔记本",
  32. "img": "img/bjb/bjb8.jpg"
  33. },
  34. {
  35. "goodName": "联想笔记本",
  36. "img": "img/bjb/bjb9.jpg"
  37. },
  38. {
  39. "goodName": "联想笔记本",
  40. "img": "img/bjb/bjb10.jpg"
  41. }
  42. ]

shouji.json

  1. [
  2. {
  3. "goodName": "华为手机",
  4. "img": "img/shouji/sj1.jpg"
  5. },
  6. {
  7. "goodName": "华为手机",
  8. "img": "img/shouji/sj2.jpg"
  9. },
  10. {
  11. "goodName": "华为手机",
  12. "img": "img/shouji/sj3.jpg"
  13. },
  14. {
  15. "goodName": "华为手机",
  16. "img": "img/shouji/sj4.jpg"
  17. },
  18. {
  19. "goodName": "华为手机",
  20. "img": "img/shouji/sj5.jpg"
  21. },
  22. {
  23. "goodName": "华为手机",
  24. "img": "img/shouji/sj6.jpg"
  25. },
  26. {
  27. "goodName": "华为手机",
  28. "img": "img/shouji/sj7.jpg"
  29. },
  30. {
  31. "goodName": "华为手机",
  32. "img": "img/shouji/sj8.jpg"
  33. },
  34. {
  35. "goodName": "华为手机",
  36. "img": "img/shouji/sj9.jpg"
  37. },
  38. {
  39. "goodName": "华为手机",
  40. "img": "img/shouji/sj10.jpg"
  41. }
  42. ]

四 安装axios

  1. cnpm i axios -S

五 代码

1 创建首页First.vue

  1. <template>
  2. <div class="main">
  3. <div class="left">
  4. <Left></Left>
  5. </div>
  6. <div class="right">
  7. <div class="top">
  8. <img src="img/title.jpg" alt="">
  9. </div>
  10. <div class="buttom">
  11. <Right></Right>
  12. </div>
  13. </div>
  14. </div>
  15. </template>
  16. <script>
  17. /* 引用组件*/
  18. import Left from '../components/Left.vue'
  19. import Right from '../components/Right.vue'
  20. export default {
  21. name: "First",
  22. /* 页面要用到的组件都放在这里 */
  23. components: {
  24. Left,
  25. Right
  26. }
  27. }
  28. </script>
  29. <style scoped>
  30. * {
  31. padding: 0;
  32. margin: 0;
  33. }
  34. .left {
  35. width: 100px;
  36. float: left;
  37. margin-right: 10px;
  38. }
  39. .right {
  40. width: 1000px;
  41. float: left;
  42. margin-left: 10px;
  43. }
  44. .main {
  45. width: 1200px;
  46. margin: 20px auto;
  47. }
  48. .top img {
  49. height: 200px;
  50. width: 1000px;
  51. }
  52. .left, .right {
  53. background-color: #f5f5f5;
  54. height: 660px
  55. }
  56. </style>

2 创建路由文件index.js

  1. import Vue from 'vue'
  2. import VueRouter from 'vue-router'
  3. // 不用系统默认主页,而是自定义主页
  4. // import Home from '../views/Home.vue'
  5. // 引入主页
  6. import First from '../views/First.vue'
  7. Vue.use(VueRouter)
  8. // 主页路由
  9. const routes = [
  10. {
  11. path: '/',
  12. component: First
  13. },
  14. {
  15. path: '/about',
  16. name: 'About',
  17. // route level code-splitting
  18. // this generates a separate chunk (about.[hash].js) for this route
  19. // which is lazy-loaded when the route is visited.
  20. component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  21. }
  22. ]
  23. const router = new VueRouter({
  24. mode: 'history',
  25. base: process.env.BASE_URL,
  26. routes
  27. })
  28. export default router

3 App.vue

  1. <template>
  2. <div id="app">
  3. <router-view/>
  4. </div>
  5. </template>
  6. <style>
  7. #app {
  8. font-family: Avenir, Helvetica, Arial, sans-serif;
  9. -webkit-font-smoothing: antialiased;
  10. -moz-osx-font-smoothing: grayscale;
  11. text-align: center;
  12. color: #2c3e50;
  13. }
  14. #nav {
  15. padding: 30px;
  16. }
  17. #nav a {
  18. font-weight: bold;
  19. color: #2c3e50;
  20. }
  21. #nav a.router-link-exact-active {
  22. color: #42b983;
  23. }
  24. </style>

4 左边导航组件left.vue

  1. <template>
  2. <div>
  3. <div class="title">热门推荐</div>
  4. <ul class="menu">
  5. <li @click="menu1">笔记本电脑</li>
  6. <li @click="menu2">手机</li>
  7. <li @click="menu3">服饰</li>
  8. <li @click="menu4">手表</li>
  9. <li>书籍</li>
  10. <li>玩具</li>
  11. <li>小家电</li>
  12. <li>学习用品</li>
  13. <li>办公用品</li>
  14. <li>旅游必备</li>
  15. <li>游戏卡通</li>
  16. </ul>
  17. </div>
  18. </template>
  19. <script>
  20. // 引入事件总线
  21. import Msg from './Msg.js'
  22. export default {
  23. name: "left",
  24. methods: {
  25. menu1: function () {
  26. // 通过数据总线传值给兄弟节点
  27. Msg.$emit("val", "1");
  28. },
  29. menu2: function () {
  30. // 通过数据总线传值给兄弟节点
  31. Msg.$emit("val", "2");
  32. },
  33. menu3: function () {
  34. // 通过数据总线传值给兄弟节点
  35. Msg.$emit("val", "3");
  36. },
  37. menu4: function () {
  38. // 通过数据总线传值给兄弟节点
  39. Msg.$emit("val", "4");
  40. }
  41. }
  42. }
  43. </script>
  44. <style scoped>
  45. .title {
  46. width: 100px;
  47. color: red;
  48. }
  49. .menu {
  50. padding-inline-start: 0px;
  51. }
  52. .menu li {
  53. list-style: none;
  54. height: 50px;
  55. margin-bottom: 2px;
  56. background-color: white;
  57. line-height: 50px;
  58. /* 改变鼠标指针为手形形状 */
  59. cursor: pointer;
  60. }
  61. </style>

5 事件总线Msg.js,用于同级组件传值

  1. // 事件总线文件是js文件,不是vue文件
  2. import Vue from 'vue'
  3. export default new Vue

6 右边内容组件Right.vue

  1. <template>
  2. <div>
  3. <!-- 通过kk的值控制显示的内容 -->
  4. <div v-if="kk==1">
  5. <!-- 这里是属性绑定,也可以用 v-bind ,实现了组件的传值-->
  6. <GoodList :goodId="1"></GoodList>
  7. </div>
  8. <div v-else-if="kk==2">
  9. <GoodList v-bind:goodId="2"></GoodList>
  10. </div>
  11. <div v-else-if="kk==3">
  12. 33333333333
  13. </div>
  14. <div v-else-if="kk==4">
  15. 4444444444
  16. </div>
  17. <div v-else>
  18. <GoodList v-bind:goodId="1"></GoodList>
  19. </div>
  20. </div>
  21. </template>
  22. <script>
  23. // 引入事件总线
  24. import Msg from './Msg.js'
  25. // 引入自定义组件
  26. import GoodList from "./GoodList"
  27. // 下面这种写法也可以
  28. // import GoodList from "./GoodList.vue"
  29. export default {
  30. name: "Right",
  31. data() {
  32. return {
  33. kk: 0
  34. }
  35. },
  36. mounted() {
  37. // _this 是 this 的副本,不能用this,因为页面中不同的this含义不同,所以要用一个副本存储
  38. var _this = this;
  39. // 此处的 val 接收 left.vue 中兄弟节点传过来的值,然后 val 的值再传给m
  40. Msg.$on('val', function (m) {
  41. _this.kk = m;
  42. // 这里不能用 this.kk ,因为它表示的是on里面的内容,这就是前面为什么用_this的原因
  43. // this.kk = m //错误
  44. })
  45. },
  46. // 组件注册放在这里
  47. components: {
  48. GoodList
  49. }
  50. }
  51. </script>
  52. <style scoped>
  53. </style>

7 main.js

  1. import Vue from 'vue'
  2. import App from './App.vue'
  3. import router from './router'
  4. // 引入 axios
  5. import axios from 'axios'
  6. // 全局注册 axios
  7. Vue.prototype.$http = axios
  8. Vue.config.productionTip = false
  9. new Vue({
  10. router,
  11. render: h => h(App)
  12. }).$mount('#app')

8 商品列表组件GoodList.vue

  1. <template>
  2. <div name="show">
  3. <ul class="goodList">
  4. <li v-for="goods in list">
  5. <!-- v-bind 是属性绑定,这里绑定的是src属性-->
  6. <img v-bind:src="goods.img">
  7. <p>{
  8. {goods.goodName}}</p>
  9. </li>
  10. </ul>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. name: "show",
  16. data() {
  17. // 初始化代码
  18. var obj = this;
  19. var url;
  20. if (obj.goodId == 1) {
  21. url = "json/bjb.json"
  22. } else if (obj.goodId == 2) {
  23. url = "json/shouji.json"
  24. }
  25. this.$http.get(url).then(function (res) {
  26. obj.list = res.data;
  27. })
  28. return {
  29. list: []
  30. }
  31. },
  32. props: {
  33. // 调用组件时定义了goodId
  34. goodId: Number
  35. },
  36. /* 监听传递的参数 */
  37. watch: {
  38. goodId() {
  39. var obj = this;
  40. var url = "";
  41. if (obj.goodId == 1) {
  42. url = "json/bjb.json"
  43. } else if (obj.goodId == 2) {
  44. url = "json/shouji.json"
  45. }
  46. this.$http.get(url).then(function (res) {
  47. obj.list = res.data;
  48. })
  49. return {
  50. list: []
  51. }
  52. }
  53. }
  54. }
  55. </script>
  56. <style scoped>
  57. .goodList li {
  58. width: 190px;
  59. height: 190px;
  60. list-style: none;
  61. float: left;
  62. font-size: 9px;
  63. color: red;
  64. margin-bottom: 30px;
  65. }
  66. .goodList img {
  67. width: 180px;
  68. height: 180px;
  69. }
  70. </style>

六 测试

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoZW5ncWl1bWluZw_size_16_color_FFFFFF_t_70

七 源码参考

https://gitee.com/cakin24/prog

发表评论

表情:
评论列表 (有 0 条评论,817人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mui实现底部导航页面切换

    1 问题描述 mui是一款最接近原生的框架,对于会使用的人来说十分的便捷易操作,但对于像笔者这样刚入门的小白可是十分的陌生和走了太多的弯路。 对于那些不懂的前端的人,或