初识vue-基础认识(1)

161 阅读3分钟

前言

vue是什么? 官网上是这么说的

它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。

既然vue这么强,废话不多说,直接开始!

创建vue项目

创建vue-cli项目,使用npm install -g @vue/cli命令安装全局vue-cli包
然后使用vue create $name 就可以创建一个新的vue项目了
在最新版本里,如果node版本在16以上的 可以直接执行npm create vue@latest来创建vue-cli项目 接下来就可以自行选择你想安装的一些工具

image.png

现在官方推荐使用vite来创建vue项目 可以直接使用npm create vite@latest 来创建项目
过程和创建vue-cli类似 也可以直接 npm create vite@latest my-vue --template vue (-ts)来选择创建是否支持ts版本的vue
详细vite操作:开始 | Vite 官方中文文档 (vitejs.dev)

模板语法

这篇主要就讲模板语法以及一些渲染操作

文本插值

//template 在这里是没有任何含义的
<template>
    //在vue中使用{{}}包裹起来变量会被vue解析 如果name=‘张三’ 等价于下面的js代码
  <span>{{ name }}</span>
</template>

const name='张三'
const span=document.querySelector('span')
span.innerText=name

如果说想想要解析html原始片段 可以使用v-html指令 之后后面说

//如果此时HTMLDivElement='<div>这里是div</div>' 那么这段代码span就不会被渲染处出来
//渲染出来的则为div元素 显示的内容为   这里是div
<span v-html="HTMLDivElement"></span>

指令

指令是vue中不可或缺的一部分,也是vue的特点

v-bind 数据绑定

vue中所有元素上的属性都可以使用v-bind进行绑定 例如:

<img v-bind:src="name" v-bind:alt="f">

都可以使用变量进行动态赋值
v-bind也可以简写为:

<img :src="name" :alt="f">

不仅绑定属性值可以是变量 绑定属性可以是变量 只需要这样写即可

<!-- 此时name='src'的话 下面两行代码是等价的 -->
  <img :[name]="name" :alt="f">
  <img :src="name" :alt="f">

绑定的属性值可以是变量,也可以是有返回值得函数

 <img :src="srcValue('name')" :alt="f">

既然是动态绑定了,当然也是可以根据条件来进行绑定一些属性值

 <!-- 如果flag为真的话id则为pic 否则为prc -->
  <img :id="flag?'pic':'prc'">
  <!-- 如果flag为真的话 id则为pic 否则id则没有属性值 -->
  <img :id="{'pic':flag}">

如果是绑定了样式,则必须要是用对象形式来写

 <img :style="{ height: '80px', width: flag ? '100px' : '200px' }" />

v-on 事件绑定

都知道在原生js里绑定事件是on+事件名 例如dom.onclikc=fn(){} 在vue中可以直接在元素上使用 v-on:事件名 来绑定事件
例如:

<!-- 当单击了这个按钮的时候则会弹出333的弹窗 -->
 <button v-on:click="alert(333)">按钮</button>

v-on比较常用,所以也可以简写为@ 所以常用的事件就可以写成一下样式
@click 单击时触发
@dblclick 双击时触发
@mousedown 鼠标按下时触发
@mouseup 鼠标抬起时触发
@mousemove 鼠标划过时触发

在事件绑定的属性值可以是一个函数 当触发了这个事件的时候 会直接执行这个函数

<!-- 当我们这样写 点击按钮的时候 就会执行setName函数 然后按钮的名字就会改变 -->
  <button @click="setName">{{ name }}</button>
  
  //暂时可以理解为这种 响应数据还没说到
  <script>
   let name="张三"
   //点击按钮后 就会将按钮的张三 改变成李四
   function setName(params) {
     name='李四'
   }
</script>

切记 事件绑定的时候属性值里的函数带括号和不带括有区有区别
当函数没有括号的时候 函数的形参默认是当前的dom节点 如果加了括号且没有传任何值得时候 形参接受的参数就是undefined 如果加了括号还想获取当前dom节点得话可以在括号内加上 $event

<button @click="setName">{{ name }}</button>
function setName(params) {
  //此时得params就是button 节点
  name='李四'
}

//setName加上了()
<button @click="setName()">{{ name }}</button>
function setName(params) {
  //此时得params获得就是undefined
  name='李四'
}

//setName加上了() 还想继续获取dom节点得话
<button @click="setName($event)">{{ name }}</button>
function setName(params) {
  //此时得params获得就是button节点
  name='李四'
}

v-once 仅渲染一次

仅渲染元素和组件一次,并跳过之后的更新,可以用于优化性能!
当元素或组件上用了v-once 则只会在初始化时渲染一次 之后不管状态如何变化此元素都不会再改变

v-if v-else v-else-if v-show 条件渲染

v-if v-else v-else-if 看名字就知道 是类似于条件判断来执行的 使用方法为:

<!-- 当条件成立时才会渲染 否则就渲染最后一个 -->
 <!-- v-if的值不许是布尔值 或者是可以隐式转换为布尔值的值 -->
  <span v-if="1>2">1</span>
  <span v-else-if="2>2">2</span>
  <span v-else>3</span>

v-show 一样是条件渲染 他与v-if类似

 <!-- 当条件成立时才会渲染 -->
  <span v-show="2<3">1</span>

既然都是条件渲染 都有了v-if了为什么还有v-show 他们有啥区别?

v-if是惰性的 当条件不成立时 元素是不会被渲染出来的 只有条件成立了 这个时候元素才会被渲染出来
v-show不管条件有没有被渲染 则都会被渲染出来 只是当条件不成立 则会在这个元素上添加display:none 只是在视图上看不见了而已

用途和使用场景

在浏览器上渲染元素是很费性能呢,如果使用v-if频繁对元素添加删除 则会增加了浏览器的负担
但是如果有些元素确实不想要 还是用了v-show的话 元素首次全被加载了出来 首屏加载的速度会受到影响
所以在适当的情况下合理的使用v-ifv-show对项目的优化有很大帮助
以下是v-if条件不成立时,在浏览器中的样子

image.png

以下是v-show条件不成立时,在浏览器中的样子

image.png

v-for 列表渲染

如果是许多数据进行大量重复的dom渲染 就可以使用v-for指令
在使用v-for指令上的元素上 一定要加上key 可以优化性能 (以后再说)

  此时如果arr是一个数组 则会有两个参数 第一个为数组的值 第二个为数组的索引
  此时如果obj是一个对象 则会有三个参数 第一个为value值 第二个为key值 第三个为索引
  配合v-for的时候一定要在元素上添加key值 为了在重列表新渲的时候提高性能 且不建议key值为索引
  arr=[1,3,7,5]
  <ul>
    <li v-for="(item, index) in arr" :key="item">{{ item }}</li>
  </ul>
  
  渲染出来的元素:
   <ul>
    <li>1</li>
    <li>3</li>
    <li>7</li>
    <li>5</li>
  </ul>
  
  obj={
    name:'张三',
    age:18,
    phone:110,
  }
  <ul>
    <li v-for="(value, key,index) in obj" :key="value">{{ key }}</li>
  </ul>
  
  渲染出来的元素:
   <ul>
    <li>name</li>
    <li>age</li>
    <li>phone</li>
  </ul>

清楚v-ifv-for的优先级
v-if是当条件成立时就不会渲染 那么当v-ifv-for写在同一个元素上时 哪个会先执行?
vue2中 v-for的优先级比v-if要高 所以当他们写在一起时不用考虑到v-if不成立时会影响到v-for的执行
vue3中 v-for的优先级比v-if要低 当他们写在一起时v-if的条件是否成立则会影响到v-for的执行
不管在vue2和vue3中 官方都不建议v-ifv-for写在一起

v-model 双向帮绑定

后续补上来了
初识vue-基础认识(2) - 掘金 (juejin.cn)

这次就先到这

结尾

后续再慢慢更新,会把vue2到vue3得知识据我所知得更新完的!