• 前端 高级 (二十五)vue2.0项目实战一 配置简要说明、代码简要说明、Import/Export、轮播和列表例子 补充脚手架文件main.js、App.vue、index.html、index.js详解 Vue示例中的Template属性


    一、启动服务自动打开浏览器运行

    二、配置简要说明

    1、node_modules

      安装好的依赖文件,中间件等,所在位置

    2、package.jason

       配置当前项目要安装的中间件和依赖文件

    {
      "name": "my-app",
      "version": "1.0.0",
      "description": "A Vue.js project",
      "author": "",
      "private": true,
      "scripts": {
        "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
        "start": "npm run dev",//项目的启动方式
        "unit": "jest --config test/unit/jest.conf.js --coverage",
        "e2e": "node test/e2e/runner.js",
        "test": "npm run unit && npm run e2e",
        "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
        "build": "node build/build.js"//项目如何打包
      },
      "dependencies": {
        "vue": "^2.5.2",
        "vue-router": "^3.0.1"
      },
      "devDependencies": {//当前项目要安装的依赖文件,后边是版本
        "autoprefixer": "^7.1.2",
        "babel-core": "^6.22.1",
        "babel-eslint": "^8.2.1",
        "babel-helper-vue-jsx-merge-props": "^2.0.3",
        "babel-jest": "^21.0.2",
        "babel-loader": "^7.1.1",
        "babel-plugin-dynamic-import-node": "^1.2.0",
        "babel-plugin-syntax-jsx": "^6.18.0",
        "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
        "babel-plugin-transform-runtime": "^6.22.0",
        "babel-plugin-transform-vue-jsx": "^3.5.0",
        "babel-preset-env": "^1.3.2",
        "babel-preset-stage-2": "^6.22.0",
        "babel-register": "^6.22.0",
        "chalk": "^2.0.1",
        "chromedriver": "^2.27.2",
        "copy-webpack-plugin": "^4.0.1",
        "cross-spawn": "^5.0.1",
        "css-loader": "^0.28.0",
        "eslint": "^4.15.0",
        "eslint-config-standard": "^10.2.1",
        "eslint-friendly-formatter": "^3.0.0",
        "eslint-loader": "^1.7.1",
        "eslint-plugin-import": "^2.7.0",
        "eslint-plugin-node": "^5.2.0",
        "eslint-plugin-promise": "^3.4.0",
        "eslint-plugin-standard": "^3.0.1",
        "eslint-plugin-vue": "^4.0.0",
        "extract-text-webpack-plugin": "^3.0.0",
        "file-loader": "^1.1.4",
        "friendly-errors-webpack-plugin": "^1.6.1",
        "html-webpack-plugin": "^2.30.1",
        "jest": "^22.0.4",
        "jest-serializer-vue": "^0.3.0",
        "nightwatch": "^0.9.12",
        "node-notifier": "^5.1.2",
        "optimize-css-assets-webpack-plugin": "^3.2.0",
        "ora": "^1.2.0",
        "portfinder": "^1.0.13",
        "postcss-import": "^11.0.0",
        "postcss-loader": "^2.0.8",
        "postcss-url": "^7.2.1",
        "rimraf": "^2.6.0",
        "selenium-server": "^3.0.1",
        "semver": "^5.3.0",
        "shelljs": "^0.7.6",
        "uglifyjs-webpack-plugin": "^1.1.1",
        "url-loader": "^0.5.8",
        "vue-jest": "^1.0.2",
        "vue-loader": "^13.3.0",
        "vue-style-loader": "^3.0.1",
        "vue-template-compiler": "^2.5.2",
        "webpack": "^3.6.0",
        "webpack-bundle-analyzer": "^2.9.0",
        "webpack-dev-server": "^2.9.1",
        "webpack-merge": "^4.1.0"
      },
      "engines": {
        "node": ">= 6.0.0",
        "npm": ">= 3.0.0"
      },
      "browserslist": [
        "> 1%",
        "last 2 versions",
        "not ie <= 8"
      ]
    }

       node_modules文件夹下的文件就是这里定义需要安装的依赖文件或中间件等。

    3、build文件夹

      webpack的一些配置文件

      main.js入口文件定义

      webpack.base.conf.js中定义

    4、config

      项目核心配置

    5、src

    6、static

      静态文件资源也可以放这里

    7、test

      测试相关

    webpack打包后,会成为常规的html,js,css,再放到服务里执行,不会把这些源文件放到服务器执行。对这么多类别文件该解析的解析,该处理的处理,该丢弃的丢弃。

    三、模块化 代码说明

      

      模块化:把一个较大的项目拆分成很多小的互相有依赖的部分,主要有两个命令 import 输入其他模块, export 对外输出接口,如

    入口main.js里边的代码

          

        导入的中间件或依赖文件,在node_modules文件夹下

        ./当前目录

       阻止vue在启动时候生产生产提示

     入口组件App.vue

     

    路由 index.js

     加载的组件HelloWorld.vue

    脚手架文件main.js、App.vue、index.html、index.js详解

    vue-cli的相关文件以及其调用关系

    使用到vue项目的文件包括一个.html,两个.js,两个.vue文件,关系如上图所示

    1、index.html为vue项目默认首页,里面默认引用了app.vue根组件

    2、main.js为vue项目的入口文件,加载了各种公共组件(需要引用和初始化组件实例)。比如app.vue

    main.js中引入相关资源文件

     

    引入Vue实际完整写法是   import Vue from "../node_modules/vue/dist/vue.js,即从node_modules中加载相应名称的模块

    import App from './App'就是引入同目录层次下的App.vue文件

    import router from './router',引入路由文件

    初始化组件实例

    其中new Vue的参数,解释如下:

    el:官方解释为实例提供挂载的元素。此处为index.html中的<div id="app"><div>。
    router:为router:router,的简写,指向引入文件中的routes:[]
    components:注册哪些组件,需在顶部引入文件。
    template:替换挂载元素的模板组件,而挂载元素的内容都将被忽略。即用template替换index.html里面的<div id="app"></div>
          <App/>使用了组件app.vue

    如果vue实例中有template属性,会将该属性值进行编译,将编译后的虚拟dom直接替换掉vue实例绑定的元素(即el绑定的那个元素);

    index.js路由文件

    首页看看index.js文件的内容

    import Vue from 'vue'
    import Router from 'vue-router'
    import HelloWorld from '@/components/HelloWorld'
    import First from '@/components/First'
    
    Vue.use(Router)
    
    export default new Router({
      model:'history',
      routes: [
       {
          path: '/hello',
          name: 'HelloWorld',
          component: HelloWorld
        },
        {
          path: '/',
          name: 'First',
          component: First
        }
      ]
    })

    路由写法见前几篇

    首页的html生成如下

    四、Import/Export 

    1、导出一个export default 导出一个组件

    testB.vue

    <template>
      <div>
        <h1>{{ msg }}</h1>
      </div>
    </template>
    
    <script>
    export default {--只导出一个
      name: 'testB',
      data () {
        return {
          msg: 'testbbbb'
        }
      }
    }
    </script>
    export default 只可以导出一个
    APP.vue导入使用:
    <template>
      <div id="app">
        <img src="./assets/logo.png">
        <testA/><!--3、模板里使用-->
      </div>
    </template>
    
    <script>
    import testA from './components/testA';--1、导入testA和export的name保持一致
    export default {
      name: 'App',
      data(){
        return {
         a:'a'
        }
      },
      components:{
        testA --2、引用组件
      }
    }
    </script>
    
    <style>
    #app {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    </style>

    2、导出多个

    var name='sonia';
    var age = 18;
    var msg = 'hello';
    export {name,age,msg};--导出多个
    <template>
      <div id="app">
        <img src="./assets/logo.png">
        {{name}}--3、使用
      </div>
    </template>
    <script>
    import {name,age,msg} from './components/testA';--1、导入需要一个{}
    export default {
      name: 'App',
      data(){
        return {
          name:name--2、要使用先要放到data中
        }
      }
    }
    </script>
    
    <style>
    #app {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    </style>

    3、将多个导出一个对象

    export default {
         name:'12345',
         age:20
    }
    <template>
      <div id="app">
        <img src="./assets/logo.png">
        {{name.age}}--对象的使用方法
      </div>
    </template>
    <script>
    import abc from './components/testA';--一个abc是个对象,就是export default只是是一个对象
    export default {
      name: 'App',
      data(){
        return {
          name:abc--放到一个属性上
        }
      }
    }
    </script>
    
    <style>
    #app {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    </style>

    4、导出函数

    function num(x,y) {
         alert(x+y);
     };
    export {num};
    <template>
      <div id="app">
        <img src="./assets/logo.png">
        {{num(1,2)}}--3、函数调用
      </div>
    </template>
    <script>
    import {num} from './components/testA';--1、导入函数,需要{},因为导出就是以多个的方式导出
    export default {
      name: 'App',
      data(){
        return {
          num:num--2、附加到data
        }
      }
    }
    </script>
    
    <style>
    #app {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    </style>

    5、爷父子组件引用

    APP.vue 包含TestA.vue,其又包含TestB.vue

    TestB.vue

    <template>
      <div>
        <h1>{{ msg }}</h1>
      </div>
    </template>
    
    <script>
    export default {
      name: 'testB',
      data () {
        return {
          msg: 'testbbbb'
        }
      }
    }
    </script>

    TestA.vue

    <template>
      <div>
        <testB/> --使用组件testB
      </div>
    </template>
    
    <script>
    import testB from './testB';--导入组件testB
    export default {
      name: 'testA',
      data () {
        return {
          msg: 'testAAAA'
        }
      },
      components:{
        testB--引用组件testB
      }
    }
    </script>
    <template>
      <div id="app">
        <img src="./assets/logo.png">
        <testA/>--使用组件A
      </div>
    </template>
    <script>
    import testA from './components/testA';--导入组件testA
    export default {
      name: 'App',
      data(){
        return {
          a:"a"
        }
      },
      components:{
        testA--引用组件testA
      }
    }
    </script>

     五、轮播脚手架写法例子

    分两个组件banner.vue,list.vue,一个轮播组件,一个列表组件

    banner.vue

    <template>
      <div class="banner">
            <img v-for="(img,index) in imges" :src="img" v-show="index==num"/>
            <div class="banner-circle">
                <ul>
                    <li v-for="(img,index) in imges" :class="{'selected':index==num}"></li> 
                </ul> 
            </div>
        </div>
    </template>
    
    <script>
    export default {
      //name: 'testB',
      data () {
        return {
            num:0,
            imges:[require('../assets/img/banner1.jpg'),--本地图片要导入需要用require要不webpack不认识
                require('../assets/img/banner2.jpg'),
                require('../assets/img/banner3.jpg'),
                require('../assets/img/banner4.jpg'),
                require('../assets/img/banner5.jpg')],
        }
      },
        mounted:function(){   //生命周期  挂载完成
            this.play();
        },
        methods:{   //方法
            autoPlay:function(){
                this.num++;
                if(this.num == this.imges.length){
                    this.num = 0;
                }
            },
            play:function(){
                setInterval(this.autoPlay,2000);
            }
            
        }
    }
    </script>
    <style>
    *{
        margin:0;
        padding:0;
    }
    ul {
        list-style-type:none;
    }
    body {
        font-size: 14px;
        background: #fff;
        overflow-y:scroll;
        overflow-x:hidden;
    }
    html,body {
        max-width:720px;
        height:100%;
        margin:0 auto;
    }
    /*index*/
    .banner {
        position: relative;
    }
    .banner .banner-circle {
        position: absolute;
        bottom: 5px;
        left: 0;
        right: 0;
        color: #fff;
    }
    .banner .banner-circle li{
        display:inline-block;
        background: rgba(0,0,0,.3);
        border-radius: 50%;
        padding:5px;
        margin:2px;
    }
    .banner .banner-circle ul {
        text-align: center;
    }
    .banner .banner-circle .selected {
        background: rgba(0,0,0,.8);
    }
    .banner img {
        width: 100%;
        margin: 0;
        padding: 0;
    }
    </style>

    list.vue

    <template>
      <div class="index-category">
            <div class="category" v-for="list in lists"><i class="iconfont" v-bind:class="list.icon"></i><label>{{list.title}}</label></div>
      </div>
    </template>
    
    <script>
    export default {
      //name: 'testB',
      data () {
        return {
          lists:[{title:'在线咨询',icon:'icon-shenghuo'},
                    {title:'在线咨询',icon:'icon-jiaoyu'},
                    {title:'在线咨询',icon:'icon-11'},
                    {title:'在线咨询',icon:'icon-jiazheng'},
                    {title:'在线咨询',icon:'icon-shenghuo'},
                    {title:'在线咨询',icon:'icon-shenghuo'}]
        }
      }
    }
    </script>
    <style>
    /*index-category*/
    .index-category {
        margin-top: 5%;
    }
    .index-category .category {
        width: 50%;
        float:left;
        text-align:center;
    }
    .index-category .category .iconfont {
        font-size: 40px;
        display:inline-block;
        padding: 10%;
        border-radius: 50%;
        color:#fff;
        border: 3px solid #f9f9f9;
        box-shadow: 0px 0px 6px rgba(0,0,0,.5);
    }
    .index-category .category:nth-child(1) .iconfont{
        background: #f95730;
    }
    .index-category .category:nth-child(2)  .iconfont{
        background: #fa69b9;
    }
    .index-category .category:nth-child(3)  .iconfont{
        background: #49dacf;
    }
    .index-category .category:nth-child(4)  .iconfont{
        background: #908cfd;
    }
    .index-category .category:nth-child(5)  .iconfont{
        background: #92d85c;
    }
    .index-category .category:nth-child(6)  .iconfont{
        background: #ecbe35;
    }
    .index-content .index-category .category label {
        display: block;
        padding: 10% 0;
        color: #999;
    }
    /*index-category end*/
    
    </style>

    APP.vue使用上边两个组件

    <template>
      <div id="app">
        <banner/>--使用两个组件
        <list/>
      </div>
    </template>
    <script>
    import banner from './components/banner';--导入两个组件
    import list from './components/list';
    export default {
      name: 'App',
      data(){
        return {
        }
      },
      components:{
        banner,--引用两个组件
        list
      }
    }
    </script>
    
    <style>
    #app {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    </style>
  • 相关阅读:
    Mybatis+MySql 一个标签中执行多条sql语句 这个坑 ,我心中有一句MMP
    Springboot 统一异常处理
    Springboot中jar 重复冲突 导致 静态资源加载问题!
    zookeeper 命令行使用
    Storm 提交任务过程详解 (不对地方麻烦指正)
    kafka 集群安装过程
    Storm 集群安装
    hbase运行时ERROR:org.apache.hadoop.hbase.PleaseHoldException:Master is initializing的解决方法
    HBase架构原理详情
    红黑树(一) 原理和算法介绍
  • 原文地址:https://www.cnblogs.com/shawnhu/p/10087958.html
Copyright © 2020-2023  润新知