vue.js单文件组件开发,vue-cli脚手架创建项目

一、vue.js单文件组件

在很多 Vue 项目中,我们使用 Vue.component 来定义全局组件。

Vue.component('button-counter',{
    data:function(){
        return{
            counter:0
        }   
    },
    template: `<div> <h1>{{counter}}</h1></div>`
})

这种方式在很多中小规模的项目中运作的很好,但当在更复杂的项目中,下面这些缺点将变得非常明显:

  • 全局定义 (Global definitions) 强制要求每个 component 中的命名不得重复
  • 字符串模板 (String templates) 缺乏语法高亮
  • 不支持 CSS (No CSS support) 意味着当 HTML 和 JavaScript 组件化时,CSS 明显被遗漏
  • 没有构建步骤 (No build step)

文件扩展名为 .vue 的 single-file components (单文件组件) 为以上所有问题提供了解决方法


二、运行单文件组件

1.安装

(1)版本

Vue CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11.0+)。

(2)环境要求
  • 安装node.js

Node.js 是一个开源与跨平台的 JavaScript 运行时环境,内核基于 Chrome V8 引擎.

  • 安装npm

npm 是 "node package manager" 是一个基于node.js的包管理器,是node.js社区最流行,支持第三方包最多的包管理器

  • 安装vue-cli

Vue CLI 是一个基于 Vue.js 进行快速开发的标准工具。

可以使用下列任一命令安装这个新的包: -g表示全局安装

npm install -g @vue/cli
# OR
yarn global add @vue/cli
(3)创建一个项目:

vue ui是通过可视化窗口创建项目

  vue create my-project
  # OR
  vue ui
my-project项目

当创建好以后,会有一个my-project文件,文件列表为:

  • node-modules 放置一些默认自带的包文件
  • public文件放置html文件,也可以放一些css文件
  • src文件放整个项目的源代码,包括.js文件、.vue文件和一些静态资源
  • assets 放置静态资源,例如图片
  • components 放置.vue文件,也是一些子组件
  • App.vue为根组件,可以看做是父组件
  • main.js 是整个项目执行的入口
  • 其他的都是一些配置文件
(4)运行该项目
  • 该需要执行的项目文件夹目录下面,执行以下代码
//运行项目
npm run serve

2.单文件组件的暴露与导入

(1)一个组件的语法格式
  • style标签中的scoped表示这段style样式制作用于当前的组件模块
<template>
    //组件的内容
</template>

<script scoped>
    //组件要执行的javascript代码
</script>

<style>
    //组件内容的css样式
</style>
(2)子组件的暴露 BookList.vue
  • export default {}es6新语法,将组件暴露出去
<template>
  <div>
    <h3>图书管理系统</h3>
    <table class="table table-bordered">
      <thead>
        <tr>
          <th>序号</th>
          <th>名称</th>
          <th>作者</th>
          <th>价格</th>
          <th>数量</th>
          <th>操作</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="booklist in bookLists" :key="booklist.id">
          <td>{{booklist.id}}</td>
          <td>{{booklist.name}}</td>
          <td>{{booklist.author}}</td>
          <td>
            <input type="number" v-model.number="booklist.price" />
          </td>
          <td>
            <input type="number" v-model.number="booklist.quantity" />
          </td>
          <td>
            <button v-on:click="deleteBook(index)">删除</button>
          </td>
        </tr>
        <tr>
          <td>总价格:¥{{}}</td>
        </tr>
      </tbody>
    </table>
  </div>
</template>


<script>
//将组件暴露出去
export default {
  //里面的内容相当于创建一个组件的内容块
  data: function() {
    return {
      bookLists: [
        { id: 1, name: "红楼梦", author: "施耐庵", price: 35, quantity: 20 }
      ]
    };
  }
};
</script>

<!-- scoped表示这段style样式制作用于当前的组件模块 -->
<style lang="stylus" scoped>
    
</style>
(3)父组件接收组件,注册组件
  • 全局注册在程序入口 main.js
  1. import BookList from './components/BookList.vue' 导入自定义组件BookList.vue
  2. Vue.component('book-list',BookList); 全局注册子组件,即在任何一个子组件中都可以使用该组件,<book-list>即为可以使用的标签名
import Vue from 'vue' //ES6 规范导入模块方式
import App from './App.vue' //导入自定义APP.vue
import BookList from './components/BookList.vue'  //导入自定义BookList.vue

// 阻止启动生产消息,常用作指令 没有Vue.config.productionTip = false这句代码,它会显示你生产模式的消息 开发环境下,Vue 会提供很多警告
Vue.config.productionTip = false

//全局注册一个子组件,('标签名',子组件对象);  import BookList from './components/BookList.vue'
Vue.component('book-list',BookList);

//创建一个vue示例
new Vue({
  //render渲染函数接收一个 createElement 方法作为第一个参数用来创建 VNode
  render: h => h(App),
  //如果 Vue 实例在实例化时没有收到 el 选项,则它处于“未挂载”状态,没有关联的 DOM 元素。可以使用 vm.$mount() 手动地挂载一个未挂载的实例
}).$mount('#app') //.$mount('#app'), 挂载app这个父组件,同el: "#app",同样的意思
  • 局部注册在主组件App.vue

1.import InputGroup from './components/InputGroup.vue'导入自定义组件InputGroup.vue
2.components: {InputGroup} 局部注册子组件,只能在当前的父组件中去使用这个子组件,这是简写形式,<InputGroup>即为可以使用的标签名

<template>
  <div id="root">
    <!-- 在main.js中定义了全局组件后,在这里就可以使用这个子组件了 -->
    <book-list></book-list>
    <!-- 使用局部定义的子组件 -->
    <InputGroup></InputGroup>
  </div>
</template>

<script>
// 局部引用接收InputGroup.vue
import InputGroup from './components/InputGroup.vue'

export default {
  name: 'root',
  //局部注册,创建一格子组件,给子组件一个标签名字,在这里可以以json数据的形式添加很多组件
  components: {
    /**
     * 'input-group': InputGroup,     ->   InputGroup: InputGroup,    ->    InputGroup
     * 三种写法表达意思一样
     */
    InputGroup
  }
}
</script>

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