当前位置:   article > 正文

Vue前端项目实战_vue 前端实战

vue 前端实战

一、脚手架的使用

首先下载yarn

npm i -g yarn

再下载vue cil

打开cmd,输入

vue create vue-app

选择vue2

构建完成,项目目录如下

二、使用饿了么UI(ElementUI)

npm i element-ui -S

再main.js中写入以下内容导入ElementUI(全局引入):

  1. import Vue from 'vue'
  2. import App from './App.vue'
  3. import ElementUI from 'element-ui';
  4. import 'element-ui/lib/theme-chalk/index.css';
  5. Vue.config.productionTip = false
  6. Vue.use(ElementUI)
  7. new Vue({
  8. render: h => h(App),
  9. }).$mount('#app')

如果要部分引入,那么要配置babel,并导入部分

如下:

  1. import Vue from 'vue'
  2. import App from './App.vue'
  3. /* import ElementUI from 'element-ui'; */
  4. import {Row,Button} from 'element-ui';
  5. import 'element-ui/lib/theme-chalk/index.css';
  6. Vue.config.productionTip = false
  7. /* Vue.use(ElementUI) */
  8. Vue.use(Row)
  9. Vue.use(Button)
  10. new Vue({
  11. render: h => h(App),
  12. }).$mount('#app')

三、Vue Router

npm i vue-router@3.6.5

然后再router下面新建文件夹新建文件用于路由

在index.js中写入以下内容

  1. import Vue from 'vue'
  2. import VueRouter from 'vue-router';
  3. Vue.use(VueRouter)
  4. //创建路由组件,并导入
  5. import Home from '../view/Home.vue'
  6. import User from '../view/User.vue'
  7. //将路由与组件进行映射
  8. const routes =[
  9. {path:'/home', component: Home},
  10. {path:'/user', component: User}
  11. ]
  12. //创建router实例,并把映射传入
  13. const router =new VueRouter({
  14. routes
  15. })
  16. //将router导出
  17. export default router
  18. //将其导入主入口main.js,并挂载到Vue对象上

接下来要规定路由的出口

在App.vue下,当然也不是必须在这里,可以在很多地方规定出口

  1. <template>
  2. <div id="app">
  3. <!-- <el-row>
  4. <el-button>默认按钮</el-button>
  5. <el-button type="primary">主要按钮</el-button>
  6. <el-button type="success">成功按钮</el-button>
  7. <el-button type="info">信息按钮</el-button>
  8. <el-button type="warning">警告按钮</el-button>
  9. <el-button type="danger">危险按钮</el-button>
  10. </el-row> -->
  11. <router-view></router-view>
  12. </div>
  13. </template>
  14. <script>
  15. export default {
  16. name: "App"
  17. };
  18. </script>

四、嵌套路由router(为了降低代码耦合性)

可以让同样的组件在不同子组件中展示

新建一个main.vue

再进行导入index.js进行路由存储

  1. import Vue from 'vue'
  2. import VueRouter from 'vue-router';
  3. Vue.use(VueRouter)
  4. //创建路由组件,并导入
  5. import Home from '../view/Home.vue'
  6. import User from '../view/User.vue'
  7. import Main from '../view/Main.vue'
  8. //将路由与组件进行映射
  9. const routes =[
  10. //主路由
  11. {
  12. path:'/',
  13. component:Main,
  14. children:[
  15. //子路由
  16. {path:'/home', component: Home},
  17. {path:'/user', component: User}
  18. ]
  19. },
  20. ]
  21. //创建router实例,并把映射传入
  22. const router =new VueRouter({
  23. routes
  24. })
  25. //将router导出
  26. export default router
  27. //将其导入主入口main.js,并挂载到Vue对象上

再规定路由出口,谁是最上层的路由,在谁那规定出口

比如这个就是Main是主路由,其余二者为子路由

  1. <template>
  2. <div>
  3. <h1>我是main</h1>
  4. <router-view></router-view>
  5. </div>
  6. </template>
  7. <script>
  8. export default{
  9. data(){
  10. return {}
  11. }
  12. }
  13. </script>

这样就可以了

五、使用饿了么UI(ElementUI左侧导航栏实现)

对于单一的页面元素,比如导航栏这种东西我们独划分出来作为一个单独的组件来管理,方便运维,在组件中新建一个组件,这里我写左侧导航栏用

在使用这个组件的主路由下引用组件

  1. <script>
  2. import CommondAside from '../components/CommondAsdie.vue'
  3. export default {
  4. data() {
  5. return {};
  6. },
  7. components:{
  8. CommondAside
  9. }
  10. };
  11. </script>

调用格式如下

<el-aside width="200px"><commond-aside></commond-aside></el-aside>

对菜单格式进行调整,在属性中寻找自己需要修改的属性。

向菜单中传递数据

  1. menuData: [
  2. {
  3. path: "/",
  4. name: "home",
  5. label: "首页",
  6. icon: "s-home",
  7. url: "Home/Home",
  8. },
  9. {
  10. path: "/mall",
  11. name: "mall",
  12. label: "商品管理",
  13. icon: "video-play",
  14. url: "MallManage/MallManage",
  15. },
  16. {
  17. path: "/user",
  18. name: "user",
  19. label: "用户管理",
  20. icon: "user",
  21. url: "UserManage/UserManage",
  22. },
  23. {
  24. label: "其他",
  25. icon: "location",
  26. children: [
  27. {
  28. path: "/page1",
  29. name: "page1",
  30. label: "页面1",
  31. icon: "setting",
  32. url: "Other/PageOne",
  33. },
  34. {
  35. path: "/page2",
  36. name: "page2",
  37. label: "页面2",
  38. icon: "setting",
  39. url: "Other/PageTwo",
  40. },
  41. ],
  42. },
  43. ]
'
运行

那么拿到这么多数据后我们要怎么去改变菜单呢,这里我们使用computed属性进行数据的计算,同时进行绑定

  1. computed: {
  2. //没有子菜单
  3. noChildren() {
  4. return this.menuData.filter((item) => !item.children);
  5. },
  6. //有子菜单
  7. hasChildren() {
  8. return this.menuData.filter((item) => item.children);
  9. }
  10. },

这样就区分开了一级菜单和二级菜单

一级菜单导航

同时对于一级菜单的部分我们可以直接v-for进行动态渲染

  1. <el-menu-item v-for="item in noChildren" :key="item.name" :index="item.name">
  2. <!--:指的是v-bind,用来数据绑定 -->
  3. <i :class="`el-icon-${item.icon}`"></i><!-- 这里的冒号指的是动态字符串 ``并不是'' es6拼接写法 -->
  4. <span slot="title">{{ item.label }}</span>
  5. </el-menu-item>
二级菜单导航

观察数据,因为key要提供唯一且固定的值,所以我们在子菜单中所使用的值就是label,path等不同的唯一值

  1. <el-submenu
  2. v-for="item in hasChildren"
  3. :key="item.label"
  4. :index="item.label"
  5. >
  6. <template slot="title">
  7. <i :class="`el-icon-${item.icon}`"></i>
  8. <span slot="title">{{ item.label }}</span>
  9. </template>
  10. <el-menu-item-group v-for="subItem in item.children" :key="subItem.path">
  11. <el-menu-item :index="subItem.path">{{ subItem.label }}</el-menu-item>
  12. </el-menu-item-group>
  13. </el-submenu>

六、引入less

由于基本的css太过于繁琐,我们这里采取less去写

npm i less@4.1.2
npm i less-loder@6.0.0
  1. <style lang="less" scope>
  2. .el-menu-vertical-demo:not(.el-menu--collapse) {
  3. width: 200px;
  4. min-height: 400px;
  5. }
  6. </style>

这里在vue文件中引入,其中lang=“less”指的是引入less在这个style里面,然后scope是这个style只作用当前组件。

语法如下:(嵌套)

  1. .el-menu{
  2. height: 100vh;
  3. h3{
  4. color:#fff;
  5. text-align: center;
  6. }
  7. }

七、进行路由

这里创建多个页面,因为数据中的/路径是home,所以我们要重定向,redirect:'/home'

  1. const routes =[
  2. //主路由
  3. {
  4. path:'/',
  5. component:Main,
  6. redirect:'/home',
  7. children:[
  8. //子路由
  9. {path:'/home', component: Home},
  10. {path:'/user', component: User},
  11. {path:'/mall', component: Mall},
  12. {path:'/page1', component: PageOne},
  13. {path:'/page2', component: PageTwo}
  14. ]
  15. },
  16. ]

在对应标签下调用点击函数,并使用&router.push方法进行跳转

  1. ClickMenu(item){
  2. this.$router.push(item.path)
  3. },
  4. ClickSubMenu(subItem){
  5. this.$router.push(subItem.path)
  6. }

这里vue限制了用户不能跳转到当前页面,所以要用逻辑去判断一下要跳转的页面是否与当前页面一致,如果不一致才要跳转,$route表示当前路由

  1. ClickMenu(item){
  2. if(this.$route.path!==item.path&& !(this.$route.path==='/home'&&(item.path==='/')))
  3. this.$router.push(item.path)
  4. },
  5. ClickSubMenu(subItem){
  6. if(this.$route.path!==subItem.path)
  7. this.$router.push(subItem.path)
  8. }

八、进行顶部编写

  1. <template>
  2. <div class="header-container">
  3. <div class="l-content">
  4. </div>
  5. <div class="r-content">
  6. </div>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. data(){
  12. return{}
  13. }
  14. }
  15. </script>
  16. <style lang="less" scoped>
  17. .header-container{
  18. background-color: #333;
  19. height: 60px;
  20. }
  21. </style>

在主页面进行覆盖padding

  1. <style lang="less" scoped>
  2. .el-header{
  3. padding:0;
  4. }
  5. </style>

九、vuex状态管理实现左侧折叠

npm i vuex@3.6.2

这里可能会有个错误,要修改json的设置,ctrl+shift+P,搜索首选项进行修改

新建文件夹store,再新建index.js再创建其他组件的js,把需要改变的值放在state里面去管理,然后以事件形式采用提交函数调用mutations里面的修改函数,而需要被修改的页面去获取state里面的属性就完成了整个传递

state如下

  1. export default{
  2. state:{
  3. isCollapse:false
  4. },
  5. mutations: {
  6. collapseMenu(state){
  7. state.isCollapse= !state.isCollapse
  8. }
  9. }
  10. }

提交函数如下

  1. methods:{
  2. hadeleMenu(){
  3. this.$store.commit('collapseMenu')
  4. }
  5. }

获取函数如下

  1. isCollapse() {
  2. return this.$store.state.tab.isCollapse
  3. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/979318
推荐阅读
相关标签
  

闽ICP备14008679号