Vue组件

Vue组件

  • vue组件:封装前端vue特效代码,便于引用
  • 全局组件
    • 全局组件通过Vue.component在script标签中注册
      • 参数1:指定组件名称
      • 参数2:{}对象,{}内通过template指定组件要加载的内容
    • 全局组件调用:在div标签中通过组件名称进行调用
  • 局部组件
    • 局部组件定义:var 组件名称={}对象,{}内通过template指定组件要加载的内容
    • 在全局组件中定义components属性,components:{}将局部组件注册到全局组件中,进行组件的嵌套
    • 在全局组件的template属性中调用局部组件
    • 局部组件定义在全局组件之前,才能调用
  • 组件中的数据绑定data,data属性对应的是一个函数方法,函数中返回绑定的数据
    • 在template中对指定的数据进行调用
  • 组件传值
    • 父组件通过props属性给子组件传值
      • 子组件中定义props:['用来接收父组件值的变量']
      • 子组件template中调用该变量{{变量}}
      • 全局组件中调用子组件时,通过v-bind:变量='父组件要传的值'指定父组件的传值
    • 子组件通过$emit给父组件传值
      • 子组件template中绑定触发事件<button v-on:click="isupload"> 上传</button>
      • 子组件定义 methods:{isupload:function(){this.emit('事件',’数据‘)}},子组件上的点击事件成功后,通过emit 将事件和数据传递给父组件
      • 父组件的子组件标签中绑定监听事件(处理子组件的事件)
      • 父组件定义监听子组件事件的方法

单文件组件

  • 单文件组件:将一个组件相关的html结构,css样式和交互的Javascript从html文件剥离出来,合成的文件(一个组件具有了结构、表现和行为的完整功能,方便组合和重用),扩展名为.vue

    // 使用template标签来定义html部分
    <template>
    
    </template>
    // javascript要写成模块导出的形式
    <script>
    
    </script>
    // css样式
    <style>
    
    </style>
    
  • 环境配置(单文件组件不能直接运行使用,依赖于node项目对其进行解析打包)

    • 安装node版本管理工具nvm

      curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
      // 更新配置
      source .bashrc
      
    • 安装最新版本的node
      nvm install node

    • 更新npm的安装源
      npm config set registry https://registry.npm.taobao.org

    • 创建项目目录
      mkdir project

    • 进入项目目录,初始化项目目录

      cd project
      npm init
      #初始化完成后在当前目录中会生成一个package.json文件,该文件指定项目所以依赖的模块
      
    • 配置package.json文件

      {
      "name": "project",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
          "test": "echo \"Error: no test specified\" && exit 1",
          "build": "webpack"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "dependencies": {
          "babel-core": "^6.22.1",
          "babel-loader": "^7.1.1",
          "babel-preset-env": "^1.3.2",
          "babel-preset-stage-2": "^6.22.0",
          "babel-register": "^6.22.0",
          "css-loader": "^0.28.11",
          "element-ui": "^2.7.2",
          "file-loader": "^1.1.4",
          "lodash": "^4.17.4",
          "style-loader": "^0.23.1",
          "url-loader": "^1.1.2",
          "vue": "^2.6.10",
          "vue-loader": "^15.7.0",
          "vue-router": "^3.0.2",
          "vue-style-loader": "^3.0.1",
          "vue-template-compiler": "^2.5.2",
          "webpack": "^4.29.6",
          "webpack-cli": "^3.3.0",
          "webpack-dev-server": "^3.2.1"
          }
      }
      #该文件定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)
      
    • 安装项目依赖模块
      npm install

      • npm install 命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境
    • 创建项目文件 main.js ,index.html, App.vue
      touch index.html main.js App.vue.

      • index.html文件时项目的首页文件
      • main.js 文件定义vue及调用单文件组件,也是项目打包时所依赖的文件
      • App.vue文件为单文件组件文件
    • 创建webpacke打包的配置文件webpack.config.js

      const path = require('path')
      const VueLoaderPlugin = require('vue-loader/lib/plugin');
      
      module.exports = {
          entry: { main: "./main.js" }, //入口文件
          output: {
              filename: 'index.js', //出口文件名
              path: path.resolve(__dirname), //当前目录
              library: 'index' // 打包后模块的名称
          },
          plugins: [
              // make sure to include the plugin for the magic
              new VueLoaderPlugin()
          ],
          module: {
              rules: [ //定义不同类型的文件使用的loader
                  {
                      test: /\.vue$/,
                      loader: 'vue-loader'
                  },
                  {
                      test: /\.js$/,
                      loader: 'babel-loader'
                  },
                  {
                      test: /\.css$/,
                      loader: 'vue-style-loader',
                  },
                  {
                      test: /\.css$/,
                      loader: 'css-loader',
                      options: {
                          minimize: true //添加
                      }
                  }, 
                  {
                      test: /\.(eot|svg|ttf|woff|woff2)$/,
                      loader: 'file-loader'
                    },
              ]
          }
      }
      #在通过webpack对项目进行打包时,需要指定相应的配置文件,同过配置文件对单文件组件中的各个内容进行解析,生成一个index.js的压缩文件,在index.html只需引该文件就可进行页面加载渲染
      
    • 目录创建完成后的结构


      Snip20190404_1.png
  • 单文件组件打包

    • 项目搭建完成后需要分别对 main.js , index.html , App.vue 文件进行编写代码
    • 项目打包npm run build
      • 文件编写完成后并不能直接运行index.html产生效果,需要对项目进行打包生成一个渲染后的index.js文件进行使用
      • 打包后会在当前目录下生成一个index.js 文件,在index.html中引用该文件,运行index.html文件看到效果
    • 项目调试运行
      // 在项目目录下,执行下面指令可以开启前端服务,自动运行前端代码
      ./node_modules/.bin/webpack-dev-server
      
  • 多个单文件组件使用

    • 在project目录下创建components文件夹,将所有子组件放入components文件夹下
    • 多组件嵌套使用
      • 在新建的components文件夹中定义多个子组件
      • 在App.vue的script标签中导入并注册多个子组件,在template标签中调用子组件
      • npm run build 重新生成index.js文件
    • 多组件路由使用(使用路由形式阻隔多个单路由)
      • 定义路由目录和路由文件router.js
      • 在main.js文件中导入并使用router
      • 在App.vue中指明路由标签
      • 运行项目./node_modules/.bin/webpack-dev-server
  • Element-ui

    • Element-ui将样式封装成单文件组件,可以直接集成到项目中
      -从网址element中复制一段div标签,即样式
    • 将复制的样式复制到components中.vue文件的template标签中(在template中新添加div标签)
    • 在router.js中添加该样式文件的路由匹配,进行分发操作
    • 在main.jszhong 导入ElementUI并使用Vue.use(ElementUI)

vue-cli的使用

  • 借助vue-cli创建出我们的所有项目文件
  • 步骤
    • 全局安装vue-cli npm install --global vue-cli
    • 项目创建 vue init webpack 项目名
    • 运行调试项目 npm run dev在项目目录下执行此指令
    • 项目打包npm run build
  • 生成的目录文件
    • src,主开发目录,要开发的单文件组件全部在这个目录下
    • static,静态资源目录,所有的css,js文件放在这个文件夹
    • components,组件目录,vue格式的单文件组件都存在这个目录中
    • router,路由目录,在此文件夹中配置组件路由
    • node_modules目录是node的包目录
    • config是配置目录,build是项目打包时依赖的目录
  • 页面结构说明
    • 整个项目是一个主文件index.html,index.html中会引入src文件夹中的main.js,main.js中会导入顶级单文件组件App.vue,App.vue中会通过组件嵌套或者路由来引用components文件夹中的其他单文件组件。


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

推荐阅读更多精彩内容