脚手架

创建脚手架流程:

  1. 创建一个基于webpack模板的新项目
// my-project 为自定义项目名
vue init webpack my-project
项目的名字不能大写,不然会报错
  • yes no no no
  1. 安装依赖
cnpm install
  1. 运行项目
cnpm run dev

了解脚手架的基本内容:

  1. build文件夹及目录

webpack的配置,主要用于打包时的一些设置

  1. config文件以及子目录

整个项目开发运行时的一些配置
npm run dev时项目的启动端口等等

  1. node_modules文件以及子目录

node 的基础依赖包

  1. src文件以及子目录
  • assets文件夹:放置资源文件(js,css......)
  • components文件夹:组件的全部文件
    组件!(一个vue项目是由一个个vue组件拼接起来的)
  • router文件:整个vue项目的路由,vue时单页面应用的代表,配置每个组件的地址文件夹
  • app文件:整个文件的入口文件,相当与包裹整个页面的最外层的div
  • main.js 文件:项目的主js,全局的使用各种变量、js、插件 在这里定义,引入
  1. static 文件夹以及子目录:

静态资源文件

  1. index 文件:

项目的承载页面

  1. package 文件:

整个项目所用到的插件的json的格式

脚手架的运行流程:

  1. 程序的入口build文件夹下的webpack.base.conf.js文件:指定了整个文件配置成功后,在去执行的入口文件是src文件下的main.js文件
  2. main.js文件:构建的是vue实例(针对的是:index.html(该文件只提供了挂载容器)(脚手架都是基于单页面开发,所以会有唯一的html文件(index.html)))
  3. main.js进行渲染组件:App.vue(唯一的根组件是App.vue)
  4. App.vue组件:
  • template:组件的内容+路由出口

router文件下的index.js:整个脚手架的配置项

1 程序的入口

首先,项目通过webpack进行打包,需要配置一个入口文件 
在脚手架工程中,入口文件的配置文件位于build/webpack.base.conf.js 
(webpack.base.conf.js为dev和prod配置文件公用配置,分别在dev和prod配置中被导入)

入口文件指向了src/main.js,(webpack对项目的打包入口为main.js)

import Vue from 'vue'           // 导入vue
import App from './App'         // 导入根组件
import router from './router'   // 导入路由

Vue.config.productionTip = false

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

可以看到,在入口文件main.js中,引入了Vue,根组件App,和路由插件router
并在初始化Vue实例时,配置挂载到#app,注册router插件,使用App根组件
挂载的#app位于项目跟目录的index.html中

2 index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>hello-vue</title>
  </head>
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

表面上,index.html是一个空的html文档,仅提供了一个挂载点
实际并不是这样,这个index.html是作为一个模板存在的,
这里涉及到webpack的插件HtmlWebpackPlugin

回到webpack配置build/webpack.dev.conf.js

HtmlWebpackPlugin插件能根据模板生成html,并为生成的html页面添加静态资源引用script标签
所以我们看到的index.html并没有引用webpack打包后的静态资源文件

3,根组件App

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</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>

.vue单文件组件文件分为三个部分:

template: 组件的模板Html 可使用是写html的形式声明组件模板,不再需要拼接字符串 
script: 组件的js代码
style: 组件的CSS样式 可添加scoped属性,使CSS只对当前组件有效

根组件也是由template,script,style组成
template中使用了<router-view/>用于路由页面切换(SPA单页面应用)
路由配置在src/router/index.js中

4,路由配置src/router/index.js

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

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    }
  ]
})

src/router/index.js最终导出了一个配置了路由的路由器实例
src/router/index.js在入口文件main中被引入,并在实例化vue时注入

由于默认路径/使用组件HelloWorld进行显示(<router-view/>)
所以访问http://localhost:8080/#/时,现实的视图是HelloWorld组件样式

案例:

  • src/App.vue
<template>
  <div id="app">
<!--    <img src="./assets/logo.png"> -->
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</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;
} */
*{
    margin: 0px;
    padding: 0px;
}
  • router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Home from '@/components/Home.vue'
Vue.use(Router)

export default new Router({
  routes: [
    // {
    //   path: '/',
    //   name: 'HelloWorld',
    //   component: HelloWorld
    // }
    {
      path:'/',
      name:'Home',
      component:Home
    }
  ]
})

  • src/components/AddInfo.vue
<template>
    <div>
        <h3>TodoList管理</h3>
        <div id="con">
            <input type="text" v-model="item" id="input1"  />
            <button type="button" @click="addItem()" id="btn"  >添加</button>
        </div>
    </div>
</template>

<script>
export default {
  name: 'AddNew',
  data () {
    return {
        item:''
    }
  },
  methods:{
      addItem(){
          if(this.item==''){
              alert("所输入信息不能为空");
          }else{
              this.$emit('submitItem',this.item);
              this.item="";
          }
      }
  }
}
</script>

<style  scoped="scoped">
    #con{
        padding: 20px;
    }
    #input1{
        width: 300px;
        height: 30px;
        outline: none;
        font-size: 20px;
    }
    #btn{
        width: 60px;
        height: 34px;
        border: none;
        background-color: seagreen;
        color: white;
        outline: none;
    }
</style>

  • src/components/Home.vue
<template>
    <div>
        <AddNew  @submitItem='addList'   ></AddNew>
        <h4>待完成任务列表</h4>
        <InfoList @toDoneItem='doDone'   :list="todoList" :type="false"   ></InfoList>
        <hr />
        <InfoList @deleteItem='deleteInfo'   :list="doneList" :type="true"  ></InfoList>
    </div>
</template>

<script>
    import AddNew from '@/components/AddNew.vue';
    import InfoList from '@/components/InfoList.vue';
    
    export default {
      name: 'Home',
      data () {
        return {
            todoList:[],
            doneList:[]
        }
      },
      components:{
         AddNew,
         InfoList
      },
      methods:{
          addList(item){
              this.todoList.push(item);
          },
          doDone(index){
              this.doneList.push(this.todoList.splice(index,1)[0]);
          },
          deleteInfo(index){
              this.doneList.splice(index,1);
          }
      }
    }
</script>

<style scoped="scoped">
    
</style>

  • src/components/InfoList.vue
<template>
    <div>
        <ul>
            <li v-for="(item,index) in list"  :key="index"   @click="setInfo(index)"   >{{item}}</li>
        </ul>
    </div>
</template>

<script>
    export default {
      name: 'InfoList',
      data () {
        return {
            
        }
      },
      props:['list','type'],
      methods:{
          setInfo(index){
              if(this.type){
                  this.$emit('deleteItem',index);
              }else{
                  this.$emit('toDoneItem',index);
              }
          }
      }
    }   
</script>

<style scoped="scoped">
ul{
    margin-top: 15px;
}   
li{
    padding-left: 20px;
}
</style>

<style scoped="scoped">
    ul{
        margin-top: 15px;
    }
    li{
        padding-left: 20px;
    }
</style>

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

推荐阅读更多精彩内容