10分钟vue初步入门

news2025/5/30 13:53:02

基础原理

使用vue开发,对于新手需要了解的两个关键点是

MVVM

MVC模式变化而来,相对于MVC强调控制-模型-视图的责任分离之外,最大的特点就是引入ViewModel,支持双向绑定
在这里插入图片描述
比如你改变一个输入框 Input 标签的值,会自动同步更新到页面上其他绑定该输入框的组件的值

组件化

页面上小到一个按钮/文本输入框/图片等等元素都可以是一个单独的文件.vue,这些小组件直接可以像乐高积木一样通过互相引用而组装起来,参考如下。
在这里插入图片描述

这样的好处在于,页面上的元素都是独立可替换的,可以实现最大的复用性和独立性。这样的好处在于,页面上的元素都是独立可替换的,可以实现最大的复用性和独立性。

安装和初始化项目

当前使用环境

node --version
v14.19.1
npm -v
6.14.16

vue2和vue3

目前大多数老项目还是vue2
vue3相对vue2基本完全重构,解决了很多历史问题,这里不详述
vue2和vue3实现上有很大差别,但在基础概念上没什么大的差别,对新手上手难度相差不大
考虑到目前的应用广泛度,本教程暂时以vue2作为演示版本,后续看需求再补上vue3教程

vue-cli2 vue-cli3 vue-cli4

vue cli顾名思义,是vue提供的一套辅助命令行脚手架
可以自动生成工程目录和框架,辅助调试和开发
目前有多个版本,最新版本vue-cli4

  • Vue CLI 2更多是依赖webpack的配置,Vue CLI 3开始设计原则是“0配置",同时提供了界面配置(vue ui),减少上手难度
  • Vue CLI 4.5以下,对应的是Vue2
  • Vue CLI 4.5及以上,对应的是Vue3,当然,创建项目的时候可以选择Vue2

目前推荐使用最新的cli,为了新手简单理解vue的机制,这里会先使用vue-cli2简单演示(如果不想深入了解或没有老项目,可以直接跳过),实际代码编写推荐最新vue-cli4

vue-cli2

如下安装vue

cnpm install -g vue-cli@2.9.6

查看当前版本

npm list -g vue vue-cli
/Users/wenzhou/.nvm/versions/node/v14.19.1/lib
└── vue-cli@2.9.6

简单项目

如下,使用webpack-simple模板,默认全部回车,这里简单演示选择不使用sass
image.png
可以看到生成的目录结构如下,其中

  • package.json和webpack.config.js分别是npm/webpack配置文件
  • 核心代码在src中,index.html是入口网页,main.js是入口代码,当前main.js加载一个组件App.vue

image.png
打开package.json如下,dependencies表明包依赖就是vue,devDependencies主要是开发打包用到webpack和对应插件的依赖;webpack.config.js是标准webpack打包文件,打开后可以看到主要是配置了各种依赖和引入vue

{
  "name": "vue-2-simple",
  "description": "A Vue.js project",
  "version": "1.0.0",
  "author": "xxx",
  "license": "MIT",
  "private": true,
  "scripts": {
    "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
    "build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
  },
  "dependencies": {
    "vue": "^2.5.11"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ],
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-env": "^1.6.0",
    "babel-preset-stage-3": "^6.24.1",
    "cross-env": "^5.0.5",
    "css-loader": "^0.28.7",
    "file-loader": "^1.1.4",
    "vue-loader": "^13.0.5",
    "vue-template-compiler": "^2.4.4",
    "webpack": "^3.6.0",
    "webpack-dev-server": "^2.9.1"
  }
}

按照如上提示,进入目录操作

  • 运行npm/cnpm install安装所有依赖(dependencies中),依赖都装在同目录node_modules中
  • 运行npm/cnpm run dev运行调试服务器(devDependencies中依赖安装并运行web server)

image.png

复杂项目

如下执行vue init webpack vue-2-webpack
相对webpack-simple引入了更多生产和校验相关选项,对实际生产环境有帮助,这里简化全部默认值和No
image.png
如下,默认会自动按照依赖,生成的项目功能一致,只是引入了更多实际生产代码和更多可配置项,更适合实际企业项目开发,其它不再赘述,可查看文档
image.png

vue-cli4

卸载老版本并安装版本

 cnpm uninstall vue vue-cli -g
 cnpm install -g @vue/cli

如下,最大的差别是Vue CLI 3开始设计原则是“0配置",隐藏了大量webpack的配置,现在webpack相关配置,通过vue.config.js来配置,参考
相比vue-cli2 这里App中以组件化方式引用具体内容
运行npm/cnpm run serve运行调试服务器
image.png

工程简单解释

如下图,打开页面http://localhost:8080/ 显示如下,到此一个基本可运行的vue项目初始化完成
image.png
为了便于理解,改写App.vue如下,这就是一个标准Vue组件的写法:

  • template-html语法描述模板(模板语法参考https://v2.cn.vuejs.org/v2/guide/syntax.html,和服务端渲染的模板语法功能都差不多)
  • style-css描述样式
  • script-js描述动作和填充模板
  • data指返回的用于填充template的数据

可调试运行查看效果。

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <h1>{{ msg }}</h1>
  </div>
</template>

<script>
export default {
  name: 'app',
  data () {
    return {
      msg: 'Hello Simple Vue'
    }
  }
}
</script>

<style>
h1, h2 {
  font-weight: normal;
}
</style>

运行npm/cnpm run build编译产物在同目录dist文件夹中,实际部署中只需要dist目录+index.html部署在服务端,请求index.html即可看到如下效果
image.png

简单使用

双向绑定

文本和属性

包括完整写法和简写,如下

<template>
  <div class="border">
    <div>属性绑定</div>
    <p>Message: {{ msg }}</p> <!-- 输出消息文本绑定msg变量 -->
    <p><a v-bind:href="url" target="_blank">绑定href</a></p> <!-- 属性href绑定到url变量上 -->
    <p><a :href="url" target="_blank">绑定href-2</a></p> <!-- 属性href绑定到url变量上简写方式 -->
    <p><a :[myprop]="url" target="_blank">绑定href-3</a></p> <!-- []代表动态参数 动态参数的缩写 -->

    <p>字符串拼接 {{ msg + 'test string' }}</p>
    <p>数字计算 {{ num % 2 }}</p>

  </div>
</template>

<script>
export default {
  name: 'CompBindAttribute',
  data() {
    return {
      msg: "Hello World",
      url: "http://www.baidu.com",
      myprop: "href",
      num: 100
    }
  }
}
</script>

class和style

可以看做属性的特殊场景,包括class激活和多值指定等

<template>
  <div class="border">
    <div>Class/Style绑定</div>
    <ul>
      <li>list1</li>
      <li>list2</li>
      <li v-bind:class="{high: isActive}">list3</li> <!--对应值isActive控制class是否激活 可简写:class-->
      <li v-bind:class="[activeClass, redClass]">list4</li><!--支持数组形式指定class 每一个元素都是变量-->
    </ul>
    <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">内联样式</div> <!--内联样式 可简写:style 也支持数组方式指定-->
  </div>
</template>

<script>

export default {
  name: "CompBindClassStyle",
  data() {
    return {
      isActive: true,
      activeClass: 'high',
      redClass: 'red',
      activeColor: 'red',
      fontSize: 30
    }
  }
}
</script>

计算属性

用作复杂的属性计算优化,通过提前计算+cache可以优化性能

<template>
  <div class="border">
    <div>计算属性</div>
    <div id="example">
      {{ message }}
    </div>
    <div id="example">
      {{ message.split('').reverse().join('') }}
    </div>
    <div id="example">
      {{ reversedMessage }}
    </div>
  </div>
</template>

<script>
export default {
  name: "CompComputedAttribute",
  data() {
    return {
      message: "Hello World!!!"
    }
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    }
  }
}
</script>

流程控制

类似于服务端模板功能,增加更多html的逻辑控制语义,主要是if/else语义和for循环语义

<template>
  <div class="border">
    <div>流程控制</div>

    <h2 v-if="awesome">Vue is awesome!</h2> <!-- 注意if/else控制相关元素需要相临 -->
    <h2 v-else>Oh no 😢</h2>

    <!-- v-for 数组列表渲染 指定key标识虚拟DOM-->
    <ul id="example-1">
      <li v-for="item in items" :key="item.message">
        {{ item.message }}
      </li>
    </ul>

    <ul id="example-2">
      <li v-for="(item, index) in items" :key="item.message">
        {{ index }} - {{ item.message }}
      </li>
    </ul>

    <!-- v-for 对象列表渲染-->
    <ul id="v-for-object" class="demo">
      <li v-for="(value, name) in object" :key="name">
          {{ name }}: {{ value }}
      </li>
    </ul>

  </div>
</template>

<script>
export default {
  name: "CompProcessControl",
  data() {
    return {
      awesome: true,
      items: [
        {message: 'Foo'},
        {message: 'Bar'}
      ],
      object: {
        title: 'How to do lists in Vue',
        author: 'Jane Doe',
        publishedAt: '2016-04-10'
      }
    }
  }
}
</script>

界面交互

点击响应

通过v-on或简写方式绑定,如下

<template>
  <div class="border">
    <div>事件处理</div>

    <!--直接调用js-->
    <div id="example-1">
      <button v-on:click="counter += 1">Add 1</button> <!-- v-on绑定事件 -->
      <p>The button above has been clicked {{ counter }} times.</p>
    </div>

    <div id="example-2">
      <!-- `greet` 是在下面定义的方法名 -->
      <button v-on:click="greet">Greet</button>
      <button @click="say('hello')">Say Hello</button> <!-- 可以简写为@ -->
    </div>

    <!-- 调用响应函数 -->
  </div>
</template>

<script>
export default {
  name: "CompEventHandle",
  data() {
    return {
      counter: 0
    }
  },
  // 在 `methods` 对象中定义方法
  methods: {
    greet: function (event) {
      // `this` 在方法里指向当前 Vue 实例
      alert('Hello ' + this.name + '!')

      // `event` 是原生 DOM 事件
      if (event) {
        alert(event.target.tagName)
      }
    },
    say: function (message) {
      alert(message)
    }
  }
}
</script>

表单绑定

通过监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。如下,对应的表单值会和变量绑定。

<template>
  <div class="border">
    <div>表单绑定</div>
    <!--  v-model 在内部为不同的输入元素使用不同的 property 并抛出不同的事件:-->
    <!--  text 和 textarea 元素使用 value property 和 input 事件;-->
    <!--  checkbox 和 radio 使用 checked property 和 change 事件;-->
    <!--  select 字段将 value 作为 prop 并将 change 作为事件。-->

    <input v-model="message" placeholder="edit me">
    <p>Message is: {{ message }}</p>

    <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
    <label for="jack">Jack</label>
    <input type="checkbox" id="john" value="John" v-model="checkedNames">
    <label for="john">John</label>
    <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
    <label for="mike">Mike</label>
    <br>
    <span>Checked names: {{ checkedNames }}</span>

    <div id="example-4">
      <input type="radio" id="one" value="One" v-model="picked">
      <label for="one">One</label>
      <br>
      <input type="radio" id="two" value="Two" v-model="picked">
      <label for="two">Two</label>
      <br>
      <span>Picked: {{ picked }}</span>
    </div>

    <div id="example-5">
      <select v-model="selected">
        <option disabled value="">请选择</option>
        <option>A</option>
        <option>B</option>
        <option>C</option>
      </select>
      <span>Selected: {{ selected }}</span>
    </div>
  </div>
</template>

<script>
export default {
  name: "CompBindForm",
  data() {
    return {
      message: '',
      checkedNames: [],
      picked: '',
      selected: ''
    }
  }
}
</script>

参考文档

vue2

https://www.runoob.com/w3cnote/vue2-start-coding.html
https://www.runoob.com/vue2/vue-tutorial.html
https://v2.cn.vuejs.org/v2/guide/index.html

vue3

https://www.runoob.com/vue3/vue3-tutorial.html
https://cn.vuejs.org/guide/introduction.html

vue cli

https://cli.vuejs.org/zh/guide/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

仓库管理系统GreaterWMS的安装

本文是应网友 ubuntu 和 Nathan 要求写的&#xff1b;因为看起来 Nathan 比较着急&#xff0c;就突击了一下&#xff0c;因为时间仓促&#xff0c;错误在所难免&#xff0c;敬请谅解~ 什么是 GreaterWMS &#xff1f; GreaterWMS是完全开源的仓库管理系统。该库存管理系统是目前…

心脏病_冠心病智能预测模型(人工智能,机器学习,用于论文作业_专利_企业建模__项目申报_科研报告,收藏)

作者Toby&#xff0c;来自心脏病_冠心病智能预测模型 ​ 心脏病&#xff08;heart disease&#xff09;是心脏疾病的总称&#xff0c;包括风湿性心脏病、先天性心脏病、高血压性心脏病、冠心病、心肌炎等各种心脏病。 人体“发动机” 心脏是一个强壮的、不知疲倦、努力工作的…

更适合运动的耳机,设计时尚轻巧好用,南卡Runner CC3上手

很多喜欢健身的朋友&#xff0c;在锻炼的时候都会戴上一副耳机&#xff0c;这样可以在音乐的节奏中享受运动的乐趣。在运动耳机当中&#xff0c;骨传导耳机是这两年很受欢迎的一种类型&#xff0c;相比于更常见的真无线耳机&#xff0c;骨传导耳机因为特殊的发声方式&#xff0…

品优购项目-头部底端和整个页面底端制作

品优购项目(二) 3). nav 制作 nav 盒子通栏有高度 而且有个下边框1号盒子 左侧浮动 dorpdown 下拉导航 里面包含 dt dd2号盒子右侧浮动 navitems 导航栏组 11. logo 优化 logo 里面 首先放一个 h1 标签 &#xff0c;目的是为了提权&#xff0c;告诉搜索引擎&#xff0c;这个地方…

微信小程序开发—入门到跑路(四)

1、学习目标 今天所学习的所有知识点都是围绕自定义组件 &#xff0c; 具体参见&#xff1a;【指南>自定义组件】 知识点名称知识点内容难度系数要求程度组件创建和引用创建自定义组件、局部引用、全局引用、全局和局部比较、组件和页面的区别3星掌握组件样式样式的隔离特…

如何使用Moonbeam Safe质押GLMR/MOVR

通过Moonbeam Safe能够轻松实现与已验证的合约进行合约交互。Moonbeam的StakingInterface.sol&#xff08;虽然准确来说被描述为预编译而非合约&#xff09;已经在Moonscan上通过验证&#xff0c;能够使用Moonbeam Safe&#xff08;Gnosis的一个用户友好型分叉&#xff09;实现…

使用 vcpkg 安装 mathgl,但使用 find_package 命令却找不到的问题

问题描述 使用 vscode cmake vcpkg 进行c开发, 很 Nice. 但是在使用MathGL库的时候却出现了问题, 如果你的CMakeLists.txt 是这样写的: cmake_minimum_required(VERSION 3.0.0) project(mgl_demo VERSION 0.1.0)find_package(MathGL CONFIG REQUIRED)add_executable(mgl_de…

贝叶斯基础

概要 贝叶斯定理描述的是条件概率&#xff0c;不同于全局概率&#xff0c;它表示当某一个事件&#xff08;B&#xff09;发生时&#xff0c;另一个事件&#xff08;A&#xff09;发生的概率。从机器学习的角度&#xff0c;从全局无法知道事件&#xff08;A&#xff09;发生的概…

IT行业岗位分析系统设计与实现(Spark+Hadoop)

目 录 摘要 I ABSTRACT II 1 引言 1 1.1 研究背景 1 1.2 研究意义 1 1.3 研究内容与组织结构 1 2 相关理论与技术介绍 3 2.1 HDFS简介 3 2.2 Spark简介 4 2.3 MongoDB数据库简介 6 2.4 爬虫技术简介 7 2.5 Echarts简介 8 2.6 Pyqt5简介 8 2.7 本章小结 8 3 系统需求分析 9 3.1…

BertNet、RoBertaNe

又带来了可扩展、可解释&#xff0c;从预训练语言模型中高效提取知识图谱的新框架 来自加州大学圣迭戈分校&#xff08;UCSD&#xff09;、卡内基梅隆大学&#xff08;CMU&#xff09;等机构的研究者提出了一种自动知识抽取框架&#xff0c;可以从 BERT 或 RoBerta 等预训练语…

fpga实操训练(利用fpga实现pwm)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 pwm&#xff0c;其实就是方波。它的本质就是通过方波中占空比的调节&#xff0c;实现对外部设备的控制。简单如台灯&#xff0c;复杂如电机都是这么…

【Java系列】小小练习——带你回顾Java基础语法

返回主篇章         &#x1f447; 【Java】才疏学浅小石Java问道之路 Java小练习1. 练习一1.1 题目1.2 题解(附解析)2. 练习二2.1 题目2.2 题解(附解析)3. 练习三3.1 题目3.2 题解(附解析)小结1. 练习一 1.1 题目 定义三个变量&#xff0c;分别为人物性别、年龄、身高…

Python-实战:基于白鲸优化BWO算法的VMD超参数优化

目录 1、白鲸优化算法 2、BWO优化VMD参数 3、实战 3.1 原始时间序列数据 3.2 VMD分解--直接设置参数 3.3 采用BWO优化VMD 4、代码 在博客的基础上&#xff0c;本文利用白鲸优化算法对VMD的参数进行优化&#xff0c;采用python实现。 1、白鲸优化算法 白鲸优化算法([Beluga…

【Python】自动备份脚本

文章目录一、前言二、代码一、前言 之前因为疫情常常不知道会不会被封在家里&#xff0c;又不想把电脑带过来带过去&#xff0c;就做了这个自动备份的脚本。 功能如下&#xff1a; 自动从指定根目录里将找到的所有指定后缀名的文件备份到一个备份文件夹里&#xff1b;将备份…

ImageAdaptive-YOLO

又发现了一个yolo~~ 恶劣天气下的目标检测 也叫IA-YOLO 源代码&#xff1a;https://github.com/wenyyu/ImageAdaptive-YOLO 尽管基于深度学习的目标检测方法在传统数据集上取得了可喜的结果&#xff0c;但从恶劣天气条件下捕获的低质量图像中定位目标仍然具有挑战性。现有方…

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

写在片头&#xff1a;声明&#xff0c;勿杠 首先简单说一下&#xff0c;这三次面试阿里并不是一次性去面的&#xff0c;实际上第一次面试时候还在大四&#xff0c;找的实习岗&#xff0c;不太清楚是什么部门&#xff0c;别问我为什么还记得面试题&#xff0c;有记录和复盘的习…

C++Easyx世界杯版跑酷小游戏

&#x1f411;本文作者&#xff1a;克隆窝&#x1f411; &#x1f3ae;&#x1f50a;本文代码适合编译环境&#xff1a;DEV-C&#x1f4bb; ✨&#x1f9e8;温馨提示&#xff1a;此文乃作者心血&#xff0c;如要转载请标注版权&#xff0c;否则视为抄袭&#xff01;&#x1f38…

计算机毕设Python+Vue羊肉溯源系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python图形用户界面(GUI)之PyQt6入门及转换视频格式示例

上篇文章中学习的wxPython用户界面&#xff0c;没有拖拽组件等操作&#xff0c;不是很方便&#xff0c;下面来看个更加强大的GUI>PyQt系列&#xff0c;拥有拖拽组件界面&#xff0c;这样设计界面就显得非常简单与方便了。Qt库由 Riverbank Computing开发&#xff0c;是最强大…

【Linux】版本控制器Git

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;Git概述&a…