从0学习Vue3(1)

222 阅读5分钟

Vue3 学习

学习路线大概是这样:

  1. Vue3的基础语法
  2. 组件化开发
  3. 全家桶相关内容(vuex vue-router)
  4. 底层原理
  5. 项目(axios ajax http)

1.用 Vue3 写一个hello world

首先呢,建一个html文件,写一个基本的<div id='app'>,引入官网给的CDN。创建一个Vue实例:

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Document</title>
 </head>
 <body>
     <div id="app"></div>
     <script src="https://unpkg.com/vue@next"></script>
     <script>
         //Vue.createApp创建一个vue的实例,里面定义它的功能
         //Vue2的话使用 new Vue()
         Vue.createApp({}).mount("#app")//mount方法,可以挂载一个dom节点
     </script>
 </body>
 </html>

接着我们绑定数据,在<div>中加入<h1>来展示数据:

 
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Document</title>
 </head>
 <body>
     <div id="app">
         <!-- vue想实现绑定数据的话用{{}},变量在createApp内定义data() -->
         <h1>{{msg}}</h1>
     </div>
     <script src="https://unpkg.com/vue@next"></script>
     <script>
         Vue.createApp({
             data(){     //data是一个函数,真正的数据是data()的返回值
                 return {
                     msg:'hello world'
                 }
             }
         }).mount("#app")
     </script>
 </body>
 </html>

ok!进去浏览器看一下,没什么问题。那么小结一下:

  1. vue2中是用new Vue创建实例,而vue3使用Vue.createApp创建实例。
  2. vue2中挂载节点除了mount 还可以new Vue({el:'#app'}),但vue3就只用mount了。
  3. 像这个示例,我们通过引用js来使用vue<script src="https://unpkg.com/vue@next"></script>vue2的data直接是一个对象: data:{},而vue3直接是一个函数了: data(){}

2.学习基本操作

学习vue首先最关注的3点:

  1. 如何操作html文本
  2. 如何操作html属性(href,src)
  3. 如何绑定事件

解决这三点的话,就能做很多案例了。比如:轮播图、计时器等等

ok,在上一个案例的基础上学习。我们知道在<h1>标签中绑定文本我们用到了两个花括号<h1>{{msg}}</h1>,那么除了这种方式,我们可以用指令来绑定文本。

指令:vue提供的一些特殊属性*,以 "v-" 开头,所谓 属性 就是写在标签内部的嘛*

这里我们绑定文本用的是 v-text

 指令:vue提供的一些特殊 属性,以 "v-" 开头
 <h1 v-text="msg"></h1>

那么这样之后我们可以看到效果跟原来是一样的,这样就绑定文本了。那么第一个点解决了如何操作html文本

接下来第二点,操作属性。还是用<h1>标签来举例,它有一个属性 title,用处是当你鼠标悬浮在它上面的时候,会弹出一个框展示你 title 的内容。通常来说是这样写

 <h1 title='hello vue3' v-text='msg'></h1>

那么我们想实现用vue来绑定它可以这样:

先在Vue中声明个变量 tit 给它

 data(){
   return {
      msg:'hello world', //别忘了写逗号
      tit:'hello vue3'
   }
 }

接下来介绍另一个指令v-bind绑定属性,用法是 需要在冒号后面写上要绑定的属性像这里是

 <h1 v-bind:title='tit' v-text='msg'></h1>
 <!-- 而且可以直接简写为只有冒号 : 像下面这样-->
 <h1 :title='tit' v-text='msg'></h1>

ok,那么绑定属性也完成了,接下来是绑定事件。用到的是v-on:

事件触发会执行函数嘛,所以我们要先去定义函数:

 <script>
         Vue.createApp({
             data(){
                 return ......
             },
             methods:{       //跟data()同级,有一个methods,是一个对象,里面我们放函数
                 showData(){ //这里定义一个showData()
                     alert("hello Vue3")
                 }
             }
         }).mount('#app')
 </script>

然后绑定事件我们用到的指令v-on: ,这里我们用点击事件:

 <h1 :title='tit'
     v-text='msg'
     v-on:click="showData"></h1>
 <!-- v-on同样可以简写,简写为 @ -->
 <h1 @click="showData"></h1>

这样点击我们的 hello world 就可以触发showData()了,会有一个提示框出来。

2.1 计数器案例

ok。趁热打铁,做一个计数器 左边减号 中间数字 右边加号,我们要实现效果是点击按钮会触发响应效果。

铁子们最好自己先敲一遍,然后再来瞅瞅我的,应该是不会有什么差别。非常简便。

     <div id="app">
         <button @click="minus">-</button>
         <span>{{num}}</span>
         <button @click="add">+</button>
     </div>
     <script src="https://unpkg.com/vue@next"></script>
     <script>
         Vue.createApp({
             data(){
                 return {
                     num:0
                 }
             },
             methods:{
                 add(){
                     this.num++
                 },
                 minus(){
                     this.num--
                 }
             }
         }).mount('#app')
     </script>

2.2 图片切换功能

接着训练,我们现在同一个目录下建一个images文件夹,里面存上我们自己喜欢的三张图片,这里我就分别叫1.jpg,2.jpg,3.jpg 了。

好那先说一下我们要实现的效果吧,简单地把图片展示出来就可以了,然后后面跟着三个按钮1,2,3,点击不同的按钮分别展示不同的图片。先实现一下图片和按钮。

 <div id="app">
         <!-- img就是用来展示图片的了,src写图片的路径 -->
         <img src="images/1.jpg" /> 
         <button @click="">1</button>
         <button @click="">2</button>
         <button @click="">3</button>
 </div>

当然想实现这个效果可以有很多种写法,我这里写的是用数组来存储三张图片的地址,然后按按钮的时候呢分别读取数组中的对应元素。因为这样代码可以写得比较少一些,只写一个函数通过传参的方式就可以分别传出三张图片地址了。

     <div id="app">
         <!-- 为了切换起来不会太怪,我给它们设置了宽高 -->
         <img :src="src" width="700" height="400" />
         <button @click="changePic(0)">1</button>
         <button @click="changePic(1)">2</button>
         <button @click="changePic(2)">3</button>
     </div>
     <script src="https://unpkg.com/vue@next"></script>
     <script>
         Vue.createApp({
             data(){
                 return {
                     //想要实现这种切换效果,肯定得绑定数据吧,如果写死数据那就变不了了
                     //所以先定义一个src属性,来放到img里面,默认是第一张图片
                     src:'images/1.jpg',
                     list:[
                         "images/1.jpg",
                         "images/2.jpg",
                         "images/3.jpg"
                     ]
                 }
             },
             methods:{
                 changePic(index){ //这里传参index,表示数组的下标
                     //触发这个函数,应该  改变src的值
                     this.src = this.list[index]
                 }
             }
         }).mount('#app')
     </script>

这样就可以实现一个,点击按钮改变图片的效果啦。

那我们就这个案例,来思考问题,像我这样写,如果说要加一张图片,首先得在list里面加图片,然后又得加一个按钮,按钮又是非常重复的,那么怎么做才能更简洁呢,接下来这个知识点就可以帮助到。

2.3渲染列表

我们这里呢写一个英雄联盟列表,大家可以根据自己喜欢的写啊哈哈哈哈没差的。

 <div id="app">
         <ul>
             <li>亚索</li>
             <li>永恩</li>
             <li></li>
         </ul>
 </div>

这里代码可以用快捷键写 ul>li*3就可以在div里自动生成这样一个框架了。

这里呢介绍一个新的指令v-for 有点像是我们的for循环的意思,看我使用:

     <div id="app">
         <ul>
             <!-- 只留一个<li>在里面用v-for,item就表示list中的每一个元素 -->
             <li v-for="item in list">
                 {{item}}
             </li>
         </ul>
     </div>
     <script src="https://unpkg.com/vue@next"></script>
     <script>
         Vue.createApp({
             data(){
                 return {
                     list:["亚索","永恩","劫"]  //记得双引号哝,是字符串才能展示
                 }
             }
         }).mount('#app')
     </script>

我们加上一个按钮,通过点击按钮来往 list 中加元素。

     <div id="app">
         <!-- 加一个按钮,触发事件 -->
         <button @click="add">添加</button>  
         <ul>
             <li v-for="item in list">
                 {{item}}
             </li>
         </ul>
     </div>
     <script src="https://unpkg.com/vue@next"></script>
     <script>
         Vue.createApp({
             data(){
                 return {
                     list:["亚索","永恩","劫"]
                 }
             },
             methods:{
                 add(){
                     this.list.push("卡特琳娜")//点击按钮,往list中push
                 }
             }
         }).mount('#app')
     </script>

这样呢,就实现了点击按钮之后 列表中添加元素。

这个时候我们发现,操作列表的时候根本不用去管dom,我们只需要去操作列表list,就能够自动实现数据在列表的渲染,这就是vue的作用了。那么我们回到刚刚2.2的图片切换的例子。

原本我们是这样写:

     <div id="app">
         <img :src="src" width="700" height="400" />
         <button @click="changePic(0)">1</button>
         <button @click="changePic(1)">2</button>
         <button @click="changePic(2)">3</button>
     </div>
     <script src="https://unpkg.com/vue@next"></script>
     <script>
         Vue.createApp({
             data(){
                 return {
                     src:'images/1.jpg',
                     list:[
                         "images/1.jpg",
                         "images/2.jpg",
                         "images/3.jpg"
                     ]
                 }
             },
             methods:{
                 changePic(index){
                     this.src = this.list[index]
                 }
             }
         }).mount('#app')
     </script>

那通过上面的学习之后,我们进行修改:

一个一个来,首先是button的展示

 <button v-for='item,index in list'>{index + 1}</button>
 <!-- index呢,是数组的下标,从0开始,所以我们展示的部分用 index+1 就是从1开始了 -->

接着,原来button里面有什么呢,有@click点击事件对吧,但现在我们可以得到item了,item直接就是图片的地址,所以不需要再 list[index] 了:

 changePic(src){
       this.src = src
 }

接着往button里面加点击事件:

 <!-- 这里我们传参是item,也就是图片地址了 -->
 <button
         v-for='item,index in list'
         @click="changePic(item)"
         >{index + 1}</button>

把整个代码展示一下:

     <div id="app">
         <img :src="src" width="700" height="400" />
         <button
             v-for='item,index in list'
             @click="changePic(item)"
         >{index + 1}</button>
     </div>
     <script src="https://unpkg.com/vue@next"></script>
     <script>
         Vue.createApp({
             data(){
                 return {
                     src:'images/1.jpg',
                     list:[
                         "images/1.jpg",
                         "images/2.jpg",
                         "images/3.jpg"
                     ]
                 }
             },
             methods:{
                 changePic(src){
                     this.src = src
                 }
             }
         }).mount('#app')
     </script>

这样子,再往list里面加图片的话,就不需要去碰button了自动会多加按钮,嘿嘿。