vue学习-01vue入门

2023-11-15

Vue官网地址

https://cn.vuejs.org/

Vue介绍

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

兼容性

Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAScript 5 的浏览器。

Vue Devtools

正谷歌浏览器应用商店搜索Vue Devtools,安装即可

iguge谷歌助手

科学上网,然后在谷歌的应用商店安装iguge

命令行工具 (CLI)

参考地址:https://cli.vuejs.org/zh/
Vue CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11.0+)。你可以使用 nvm 或 nvm-windows 在同一台电脑中管理多个 Node 版本。
安装环境:npm install -g @vue/cli

创建一个项目

这里提供几种方案:

  1. 升级为vue 3.x版本
npm uninstall vue-cli -g
npm install -g @vue/cli

2.降级为vue2.x方法

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

3.vue2.x脚手架的安装和初始化项目

# 创建项目
vue init webpack 项目名字
# 注意 ,以上步骤会让你创建一个vue文件夹存放vue项目,一般是webpack项目,与html中引入vue.js有一点点区别,注意router 那块选择yes,其他的选择no

#初始化项目
npm install

# 运行项目
npm run dev

4.vue3.x脚手架的安装和初始化项目

# 创建项目
vue create 项目名字
# 项目初始化
npm install

# 启动项目
npm run dev  

或者:在项目的根目录下运行:npm run serve

VSCode的安装插件 Vetur

Vue知识点

  1. 模板语法
    参考HelloWorld.vue文件
    注意事项:模板中可以放语法,单个表达式语法

    1. 文本:{{}}
    2. 原始HTML:v-html
    3. 动态属性绑定:v-bind:
  2. CSS作用域
    scoped:作用域 在Vue的文件中,也有css的作用域,增加scoped属性,样式只能在当前组件中生效

  3. 条件渲染
    v-if
    v-else
    v-show
    v-if和v-show的区别:
    v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
    v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
    相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
    一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

  4. 列表渲染
    v-for
    v-for 与 v-if 一同使用:注意我们不推荐在同一元素上使用 v-if 和 v-for

    1. 渲染数组(itme,index)
    2. 渲染对象(value,name,index)
  5. 事件处理
    v-on:click=“函数”

    1. 事件的实现
    2. 事件传递参数
    3. 事件修饰符
    4. 缩写:v-bind:key -> :key v-on:click -> @click
  6. 表单输入绑定

    1. v-model指令
    2. 修饰符 .lazy .number .trim
      **常见面试题:说一说双向数据绑定的原理!!!
  7. 数组更新检测
    数组方法的特异性:
    1. 改变元素组(会引起视图更新)
    push() pop() shift() unshift() splice() sort() reverse()
    2. 不改变元素数组,而是生成新的数组(不会引起视图更新)
    filter()、concat() 和 slice()
    对象的更新检测
    向响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新 property,因为 Vue 无法探测普通的新增 property (比如 this.myObject.newProperty = ‘hi’)
    this.$set(this.obj,“age”,20)
    API参考地址:https://cn.vuejs.org/v2/api/#vm-set

  8. 计算属性与侦听器

    1. 计算属性
      计算属性缓存 vs 方法
      我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。
    2. 侦听器
  9. Class 与 Style 绑定

    1. 绑定 HTML Class
      对象语法
      数组语法:注意事项:必须是数组嵌套对象
    2. 绑定 HTML Style
      对象语法
      数组语法
      注意:自动添加前缀,当 v-bind:style 使用需要添加浏览器引擎前缀的 CSS property 时,如 transform,Vue.js 会自动侦测并添加相应的前缀。
  10. 组件

    1. 组件的创建:单文件组件
      Vue组件由三个部分组成:HTML结构、JS逻辑、CSS样式。必须存在的是视图结果部分
    2. 组件引入
    3. 组件的复用:组件的每一次引用都是独立的实例对象
      应用场景:列表数据的操作中,例如购买数量的选择。把每一个列表单独抽离成一个组件
    4. data必须是一个函数
    5. 组件的组织

注意,此vue学习采用vue3的创建方式进行,且一开始没有创建路由,还请注意:

<template>
   <div class="hello">
       <p>{{ msg }}</p>
       <p>{{ 1+1 }}</p>
       <p>{{ num + 10 }}</p>
       <p>{{ 10 > 20 ? '真的' : '假的' }}</p>
       <p>{{ msg.split('').reverse().join('') }}</p>
       <!-- v-html:指令,Vue内置指令 -->
       <p v-html="vHTML"></p>
       <p :class="bindClass">我是文本</p>
       <a v-bind:href="Href">iwen的站点</a>
       <p v-bind:attr="attr">自定义属性</p>
       <p :class="bindClass" class="size">动态属性与固定属性不冲突</p>
       <hr />
       <h3 v-if="flag">我是孙悟空</h3>
       <h3 v-else>我是六耳猕猴</h3>
       <template v-if="flag">
           <h3>仓央嘉措</h3>
           <p>站在布达拉宫</p>
           <p>我是雪域最大的王</p>
       </template>
       <template v-else>
           <p>流浪在拉萨街头</p>
           <p>我是世间最美的情郎</p>
       </template>
       <p v-show="flag">我是show的展示</p>
       <hr />
       <ul>
           <li v-for="(item,index) in banner.data" v-bind:key="index">
               <a v-bind:href="item.url">
                   <img v-bind:src="item.image" alt />
                   <p>{{ item.title }}</p>
               </a>
           </li>
       </ul>
       <ul>
           <li v-for="(value,name,index) in userInfo" v-bind:key="index">
               <span>{{ name }}</span>:
               <span>{{ value }}</span> -
               <span>{{ index }}</span>
           </li>
       </ul>
       <p v-for="(item,index) in names" v-bind:key="index">{{ item }}</p>
       <ul>
           <li v-for="(diff,index) in diffs" v-bind:key="index">
               <span v-if="diff.flag">{{ diff.name }}</span>
           </li>
       </ul>
       <!-- 事件 -->
       <button v-on:click="clickHandle">按钮1</button>
       <button v-on:click="counter += 1">按钮2</button>
       <p>{{ counter }}</p>
       <button v-on:click="paramsHandle('hello',$event)">按钮3</button>
       <ul>
           <li
               v-on:click="getItemHandle(item)"
               v-for="(item,index) in names"
               :key="index"
           >{{ item }}</li>
       </ul>
       <form v-on:submit.stop.prevent="formHandle">
           <button>表单按钮</button>
       </form>
       <input type="text" @keyup.enter="inputHandle" />
       <hr />
       <!-- 表单输入绑定 -->
       <textarea type="text" v-model.lazy="username"></textarea>
       <p>{{ username }}</p>
       <div>
           <input type="checkbox" id="jack" value="Jack11" v-model="checkedNames" />
           <label for="jack">Jack</label>
           <input type="checkbox" id="john" value="John22" v-model="checkedNames" />
           <label for="john">John</label>
           <input type="checkbox" id="mike" value="Mike33" v-model="checkedNames" />
           <label for="mike">Mike</label>
           <span>{{ checkedNames }}</span>
       </div>
       <!-- 数组更新检测 -->
       <ul>
         <li v-for="(item,index) in container" :key="index">{{ item }}</li>
       </ul>
       <button @click="addHandle">添加数据</button>
       <ul>
         <li v-for="(value,name,index) in obj" :key="index">{{ value }}</li>
         <button @click="addObjHandle">添加数据</button>
       </ul>
       <!-- 计算属性与侦听器 -->
       <p>{{ setMSG }}</p>
       <p>{{ setMSG }}</p>
       <p>{{ getMSG() }}</p>
       <input type="text" v-model="password">
       <p>{{ password }}</p>
       <!-- class与style的绑定 -->
       <p :class="{ 'active':isActive,'text-danger':hasError }">class与style样式绑定</p>
       <ul>
         <li :class="{ 'active':index === 2 }" v-for="(item,index) in container" :key="index">{{ item }}</li>
       </ul>
       <p :class="[helloActive,helloText]">数组语法</p>
       <p :class="[isActive ? 'active' : 'text-danger',helloActive]">数组语法2</p>
       <p :class="[isActive ? 'active' : 'text-danger',{ 'text-danger1':hasError }]">必须数组嵌套对象</p>
       <p :style="{ fontSize:fontNum + 'px',display:'flex' }">style样式</p>
   </div> 
</template>

<script>
export default {
   // 函数
   data() {
       return {
           fontNum:30,
           helloActive:'active',
           helloText:"text-danger",
           isActive:false,
           hasError:true,
           password:"",
           container:[1,2,3,4,5],
           obj:{
             name:'iwen'
           },
           username: "",
           checkedNames:[],
           msg: "Hello Vue",
           num: 10,
           vHTML: "我是属性绑定",
           bindClass: "text-2", // 动态赋值,js操作,后续可以通过事件改变
           Href: "http://iwenwiki.com",
           attr: "1001",
           flag: false,
           names: ["iwen", "ime", "frank"],
           banner: {
               status: 200,
               data: [
                   {
                       image: "http://iwenwiki.com:3002/images/savefood1.jpg",
                       title: "养生从我开始,从不懈怠",
                       url: "http://iwenwiki.com"
                   },
                   {
                       image: "http://iwenwiki.com:3002/images/savefood2.jpg",
                       title: "以梦为马,不负韶华",
                       url: "http://iwenwiki.com"
                   },
                   {
                       image: "http://iwenwiki.com:3002/images/savefood3.jpg",
                       title: "都是第一次为人,凭什么我要让着你",
                       url: "http://iwenwiki.com"
                   },
                   {
                       image: "http://iwenwiki.com:3002/images/savefood4.jpg",
                       title: "这只猫太可恶了,我的耳机又坏了",
                       url: "http://iwenwiki.com"
                   },
                   {
                       image: "http://iwenwiki.com:3002/images/savefood5.jpg",
                       title: "死猫,你再咬,看我打不打你就完了",
                       url: "http://iwenwiki.com"
                   }
               ]
           },
           userInfo: {
               name: "iwen",
               age: 20
           },
           diffs: [
               {
                   name: "蔬菜",
                   flag: true
               },
               {
                   name: "水果",
                   flag: true
               },
               {
                   name: "肉类",
                   flag: false
               }
           ],
           counter: 1
       };
   },
   methods: {
       clickHandle(e) {
           // 修改data的数据
           this.flag = !this.flag;
       },
       paramsHandle(data, event) {
           console.log(data);
           console.log(event);
       },
       getItemHandle(data) {
           console.log(data);
       },
       formHandle(e) {
           // e.preventDefault();
           console.log(111);
       },
       inputHandle(e) {
           // if(e.keyCode === 13){
           //   console.log("enter");
           // }
           console.log("enter");
       },
       addHandle(){
         // this.container.push(6);
         this.container = this.container.concat([6,7,8,9])
       },
       addObjHandle(){
         // 对象的更新检测,在ES6中,我们不推荐大家直接修改对象
         // this.obj.age = 20;
         this.$set(this.obj,"age",20)
       },
       getMSG(){
         return this.msg.split("").reverse().join("")
       }
   },
   computed:{
     // 计算属性的优点,如果数据源没有发生变化,则不会重新计算
     setMSG(){
       return this.msg.split("").reverse().join("")
     }
   },
   watch:{
     /**
      * new:当前最新的数据
      * old:上一次操作的数据
      * 所有data中声明的属性都可以监听
      * 后续学习props的属性值,也可以通过watch监听数据变化
      */
     password(newPassword,oldPassword){
       /**
        * React中我们讲过搜索:搜索历史!
        */
       console.log("newPassword:"+newPassword);
       console.log("oldPassword:"+oldPassword);
       if(newPassword === "123"){
         console.log("临界值");
       }
     }
   }
};
</script>
<!-- scoped:作用域  在Vue的文件中,也有css的作用域,增加scoped属性,样式只能在当前组件中生效 -->
<style scoped>
.text-1 {
   color: red;
}
.text-2 {
   color: green;
}

.size {
   font-size: 30px;
}

.active{
 color: red;
 font-size: 30px;
}
</style>

main.js文件

import Vue from 'vue'
import App from './App.vue'
import './registerServiceWorker'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

App.vue

<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <!-- <HelloWorld msg="Welcome to Your Vue.js App"/> -->
    <MyComponent />
    <MyComponent />
    <MyComponent />
    <!-- <my-component></my-component> -->
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'
import MyComponent from "./components/MyComponent"

export default {
  name: 'App',
  components: {
    HelloWorld,
    MyComponent // 注入
  }
}
</script>

<style lang="less">
#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>

MyComponent.vue

<template>
    <!-- Vue2.x版本下,有且只能有一个根组件 -->
    <div>
        创建组件:{{ num }}
        <button @click=" num += 1 ">按钮</button>
    </div>
</template>
<script>
export default {
    name:"MyComponent",
    data(){
        return{
            num:0
        }
    },
    methods:{

    },
    computed:{

    },
    watch:{

    }
}
</script>
<style scoped lang="less">

</style>

registerServiceWorker.js

/* eslint-disable no-console */

import { register } from 'register-service-worker'

if (process.env.NODE_ENV === 'production') {
  register(`${process.env.BASE_URL}service-worker.js`, {
    ready () {
      console.log(
        'App is being served from cache by a service worker.\n' +
        'For more details, visit https://goo.gl/AFskqB'
      )
    },
    registered () {
      console.log('Service worker has been registered.')
    },
    cached () {
      console.log('Content has been cached for offline use.')
    },
    updatefound () {
      console.log('New content is downloading.')
    },
    updated () {
      console.log('New content is available; please refresh.')
    },
    offline () {
      console.log('No internet connection found. App is running in offline mode.')
    },
    error (error) {
      console.error('Error during service worker registration:', error)
    }
  })
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue学习-01vue入门 的相关文章

随机推荐

  • 提供下载地址的情感数据库大全(涵盖音视频生理图像文本)

    情感识别数据集大全 一 公开多模态数据集 1 MIT BIH 2 Aubt 3 Multi ZOL 4 SAVEE 5 eNTERFACE05 二 文本情感数据集 1 Stanford Twitter Sentiment STS 2 Ama
  • 第十四章 Spring CLoud+Hystrix+Ribbon+commandProperties 信号量隔离

    传播安全上下文或使用Spring范围 首先 当大多数人在使用Tomcat时 多个HTTP服务会共享一个线程池 假设其中一个HTTP服务访问的数据库响应非常慢 这将造成服务响应时间延迟增加 大多数线程阻塞等待数据响应返回 导致整个Tomcat
  • 北京时间与UTC时间转换

    UTC时间也称为世界标准时间 或协调世界时 英语 Coordinated Universal Time 北京时间是东八区 领先UTC 8个小时 UTC 时区差 本地时间 时区差东为正 西为负 即 北京时间 UTC时间 8小时 我们转化时主要
  • 查看Linux磁盘空间

    在 Linux 系统中 可以使用以下命令来查看磁盘空间的使用情况 1 df 命令 df h 该命令会列出当前系统所有挂载的文件系统以及它们的使用情况 包括总容量 已用空间 可用空间 使用百分比等信息 2 du 命令 du sh path t
  • 【金三银四】Spring Cloud面试题(2021最新版)

    目录 前言 一 什么是微服务架构 1 什么是微服务架构 2 为什么需要学习Spring Cloud 3 Spring Cloud 是什么 4 SpringCloud的优缺点 5 SpringBoot和SpringCloud的区别 6 Spr
  • WPS 配置MathType

    注 先找到 自己安装的 MathType 和 WPS 的安装目录 最简单的方式就找到快捷方式查看 目标 以我为例我的安装软件是32位 1 进入 MathType 目录 在 MathPage 和 Office Support目录下找到对应 位
  • stm32相关知识笔记

    keil公司是为51 arm芯片提供软件开发IDE的公司 2005年被ARM收购 Keil MDK ARM是美国Keil软件公司 现已被ARM公司收购 出品的支持ARM微控制器的一款IDE 集成开发环境 MDK ARM包含了工业标准的Kei
  • Python3,使用openpyxl进行excel数据对比,反手一个赞。

    openpyxl技能 1 引言 2 代码实战 2 1 安装 2 2 代码实战 2 2 1 思路 2 2 2 代码示例 3 总结 1 引言 小屌丝 鱼哥 我最近在对搞数据对比 你有什么便捷的方法 小鱼 斗胆问一句 数据量多少 小屌丝 不多不多
  • Activiti启动流程实例,runtimeService.startProcessInstanceByKey

    启动流程实例 添加进businessKey 本质 act ru execution表中的businessKey的字段要存入业务标识 public class BusinessKeyAdd public static void main St
  • oVirt 4.4.10三节点超融合集群安装配置及集群扩容(一)

    环境 oVrit版本 4 4 10 oVirt image https mirrors aliyun com ovirt ovirt 4 4 iso ovirt node ng installer 4 4 10 2022030308 el8
  • JAVA中的反射机制以及在Spring中的应用

    文章目录 一 反射机制 二 反射机制的使用 Class类 三 为什么要使用反射 3 1 静态编译 3 2 动态编译 3 3 反射的好处 3 4 反射的缺点 四 Spring IOC中的体现 4 1 Spring IOC的实现方式 4 2 代
  • linux内核知识图谱

    根据 深入linux内核架构 linux内核设计与实现 深入理解linux内核 得出linux内核的大类知识模块 进行后续主题式学习
  • 如何在react中使用websocket

    一 如何引用websocket npm install save react websocket 二 在组件中如何使用 1 先封装一个websocket组件 import React from react import Websocket
  • 在HTML页面中引用Markdown编辑器(Editor.md)

    目录 1 下载Ediotor md 2 引入Ediotor md 3 确定Ediotor md在哪里显示 最近写博客项目 用到了Markdown编辑器 这里介绍一款国内好用的Markdown编辑器 Editor md 下面介绍一下该编辑器以
  • ElementUI的表单效验问题 (一个页面两个form(数据相似))

    两个form 注意 两个表单必须绑定不同的 key key为字符串 否则 vue看两个表单数据大致相同就会将其上面的复用 导致效验不生效 rules
  • 论述GIS当前现状以及未来的发展前景

    GIS是空间技术和信息技术的交叉学科 相关领域的研究热点都有可能成为GIS的发展趋势 GIS的技术环节无外乎数据获取 数据分析 数据呈现三个方面 从近年的发展情况看 GIS可能在这三个方面都有着激动人心的前景 一 数据获取 数据是GIS的基
  • 警告:检测到时钟错误。您的创建可能是不完整的。

    问题 make 2 Warning File CMakeFiles MultiCol SLAM dir depend make has modification time 24688 s in the future make 2 警告 检测
  • 模式识别 - 名词解释整理

    模式识别 模式识别是指把对象根据其特征归到若干类别中适当的一类 模式识别也称为模式分类 模式 模式是指因素间存在确定性或随机性规律的对象 过程或事件的集合 识别 识别就是把对象分门别类地认出来 样本 sample 所研究对象的一个个体 样本
  • Python3中参数*args和**kwargs介绍

    在Python中 我们可以使用两种特殊符号将可变数量的参数传递给函数 args和 kwargs 你可以使用任何单词代替args和kwargs 但通常做法是使用args和kwargs args允许函数接受任意数量的位置参数 positiona
  • vue学习-01vue入门

    Vue官网地址 https cn vuejs org Vue介绍 Vue 读音 vju 类似于 view 是一套用于构建用户界面的渐进式框架 与其它大型框架不同的是 Vue 被设计为可以自底向上逐层应用 Vue 的核心库只关注视图层 不仅易