day04-Vue01

   2023-03-08 学习力0
核心提示:Vue011.Vue是什么?Vue(读音/vju:/,类似于view)是一个前端框架,依据构建用户界面Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或者项目整合支持和其他类库结合使用开发复杂的单页应用非常方便Vue是Vue.js的简称官网:Vue.js - 渐进式 JavaScr

Vue01

1.Vue是什么?

  1. Vue(读音/vju:/,类似于view)是一个前端框架,依据构建用户界面
  2. Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或者项目整合
  3. 支持和其他类库结合使用
  4. 开发复杂的单页应用非常方便
  5. Vue是Vue.js的简称

官网:Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)

github:vuejs (github.com)

2.MVVM思想

M,即Model模型,包括数据和一些基本操作

V,即View视图,页面渲染效果

VM,即View-Model,模型和视图间的双向操作(无需开发人员干涉)

  • 在MVVM之前,开发人员从后端获取需要的数据模型,然后要通过DOM操作Model渲染到View中,而当用户操作视图,我们还需要通过DOM操作获取View中的数据,然后同步到Model中。

  • 而MVVM中的VM要做的事就是把DOM操作完全封装起来,开发人员不用再关心Model和View之间是如何相互影响的。只要我们的Model发生了变化,View上自然就会表现出来;当用户修改了View,Model中的数据也就会跟着改变。

  • 这样的机制可以把开发人员从繁琐的DOM操作中解放出来,把关注点放在如何操作Model上,大大提高了开发效率

3.快速入门

3.1下载Vue.js

Vue2安装 — Vue.js (vuejs.org)

image-20230106210200824

3.2IDEA安装Vue插件

为了让IDEA识别Vue代码,需要安装插件Vue.js

Settings--Plugins--搜索“Vue”--点击Install--点击Ok--重启IDEA

image-20230106210718033

3.3应用实例

需求分析:

  1. 需求:初步体会Vue.js的数据绑定功能
  2. 体会Vue.js开发框架的主体结构

例子

创建一个静态web项目,将下载的Vue.js复制进去

image-20230106211607857
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue快速入门</title>
</head>
<body>
<div id="app">
    <!--
    1.{{message}} 叫做插值表达式
    2. message 就是从model的data{}数据池来设置的
    3.当我们的代码执行时,会到data{}数据池中去匹配数据,如果匹配上,就进行替换
        如果没有匹配上,就输出空串
    -->
    <h1>欢迎你{{message}}{{name}}</h1>
</div>
<!--引入vue.js-->
<script src="./vue.js"></script>
<script>
    //创建Vue对象实例
    let vm = new Vue({
        el: "#app",//创建的 vue 实例挂载到 id=app 的 div 下
        data: {//data{}表示数据池(model的数据),可以有很多数据,以k-v形式设置(k-v自定义)
            message: "Hello-Vue!",
            name: "你好!jack"
        }
    });
</script>
</body>
</html>
image-20230106213613547

3.4Vue数据绑定机制分析

  1. 通过查看浏览器的控制台,可以分析Vue数据绑定机制/MVVM
  2. 使用3.3应用实例,在浏览器控制台输出vue对象,看看该对象的结构
image-20230106214355836image-20230106215746271

(1)可以看到vue对象底层封装了非常多的属性和方法。其中有一个名为_data的属性,该属性其实就是我们3.3应用实例中的data,只是底层经过了包装。因此我们也可以在代码中通过vm._data.message的形式输出该数据。

image-20230106220234326 控制台输出:image-20230106220415403

同时_data属性中还有message,name属性

image-20230106221630376

因此我们也可以通过属性名直接获取

image-20230106221802036 控制台输出:image-20230106221831917

(2)Vue对象中还有许多监听器(listeners),这也解释了为什么dom一旦发生变化,数据可以更新到data数据池中。View-->Model

image-20230106220558951

(3)$el属性跟id为app的div进行绑定(Bindings),相当于把vue实例挂载到该div中,拿到了该div下的所有属性,所以在读取{{message}}等属性的时候,可以知道从哪里获取数据。

image-20230106220809291image-20230106221007076

(4)在3.3实例中,我们将message数据绑定到了<h1>元素中,因此Model中的message数据会自动同步到绑定的插值表达式中。如果data数据池中的message值被修改了,那么视图中的数据也会跟着变化。Model-->View

如下,根据Data Bindings机制,当Model的data数据池数据发生了改变,那么View中的值也会随之改变。

PS:当我们使用vm.name等方式去设置、获取属性值时,底层是通过set(),get()方法来设置的。

image-20230106224044969

3.5注意事项和使用细节

  1. 注意代码顺序,要求div在前,script在后,否则无法绑定数据

    其中,div元素不是必须的,也可以是其他元素,比如span。但是约定都是将vue对象挂载到div元素下,因为div更适合作为一个容器来布局,另外id的值是自定义的

    image-20230106224431256
  2. 从案例可以体会声明式渲染:Vue.js采用简洁的模板语法来声明式地将数据渲染进DOM的系统(底层仍然使用的DOM操作来完成,但是这个过程由Vue帮你自动处理了),做到了数据和显示分离

  3. Vue没有繁琐的DOM操作。在上面的案例中,如果使用Jquery,我们需要先找到div节点,获取到DOM对象,然后进行节点操作,显然Vue更加简洁

4.数据单向渲染

4.1基本说明

  1. v-bind 指令可以完成基本数据渲染/绑定
  2. v-bind 简写形式就是一个冒号:

4.2应用实例

需求:演示v-bind 的使用,可以绑定元素的属性

要求在浏览器页面上显示一个文本和两张图片。其中,文本可以通过插值表达式到data{}数据池获取数据。现在希望图片的src属性也到数据池中获取,如果继续使用插值表达式,是不能正常显示的,这里就要使用到v-bind指令

插值表达式是用在标签体的,如果给标签属性绑定值,则使用 v-bind 指令

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>单向数据渲染</title>
</head>
<body>
<div id="app">
    <h1>{{message}}</h1>
    <!--
        1.使用插值表达式 data数据池的数据是在标签体内
        2.如果在标签/元素 的属性上去引用data数据池数据时,不能使用插值表达式
        3.需要使用v-bind,因为v-bind是vue来解析的,默认报红,但是不影响解析
        4.如果不希望看到报红,直接 alt+enter 引入 xmlns:v-bind
     -->
    <!--<img src="{{img_src}}">-->
    <!--不需要加上{{}}-->
    <img v-bind:src="img_src" v-bind:height="img_height">
    <!--v-bind的简写形式,可以直接用冒号:-->
    <img :src="img_src" :height="img_height">
</div>
<script src="vue.js"></script>
<script>
    let vm = new Vue({
        el: "#app",
        data: {
            message: "故宫博物院",
            img_src: "1.jpg",
            img_height: "200px",

        }
    })
    console.log("vm==>", vm);
</script>
</body>
</html>
image-20230107191459273

5.数据双向绑定

5.1基本说明

使用v-model指令可以完成双向数据绑定

  1. v-bind 是数据单向渲染:data{}数据池绑定的数据变化,会影响到view

  2. v-model 是数据的双向渲染:

    (1) data数据池绑定的数据变化,会影响到view

    (2) view关联的元素变化,也会影响到dat a数据池的数据

  3. 双向绑定的底层机制就是Data Bindings 和 DOM Listeners

5.2应用实例

在输入框中输入信息,会更新到相应绑定的位置

image-20230107191841456image-20230107195713449
<!DOCTYPE html>
<html lang="en"
      xmlns:v-model="http://www.w3.org/1999/xhtml"
      xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>双向数据渲染</title>
</head>
<body>
<div id="app">
    <h1>{{message}}</h1>
    <!--
        1.v-bind 是数据单向渲染:data数据池绑定的数据变化,会影响到view
        2.v-model 是数据的双向渲染:
        (1)data数据池绑定的数据变化,会影响到view
        (2)view关联的元素变化,也会影响到data数据池的数据
        3.这里第一个输入框的数据变化,会影响到数据池的变化,
          又因为第二个输入框是数据单向渲染,因此第二个输入框的数据也会跟着数据池改变而改变,
          <p>标签体的插值表达式 同理
    -->
    <input type="text" v-model:value="hobby.val"/><br/><br/>
    <input type="text" :value="hobby.val"/><br/><br/>
    <p>你输入的爱好是:{{hobby.val}}</p>
</div>
<script src="vue.js"></script>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            message: "hi,输入你的爱好",
            hobby: {
                val: "购物"
            }
        }
    });
</script>
</body>
</html>

5.3练习

使用Vue的数据双向绑定,完成如下功能

  1. 当用户在输入框输入1.jpg、2.jpg、3.jpg时可以切换显示对应的图片
  2. 使用Vue的双向绑定完成
image-20230107195923022
<!DOCTYPE html>
<html lang="en" xmlns:v-model="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>数据渲染练习</title>
</head>
<body>
<h1>请输入图片编号 1.jpg-2.jpg-3.jpg</h1>
<div id="app">
    <!--双向绑定-->
    <input type="text" v-model:value="img_src"/><br/><br/>
    <!--单向绑定-->
    <img :src="img_src" :height="img_height"/>
</div>

<script src="vue.js"></script>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            img_src: "1.jpg",//这里是图片路径
            img_height: "200px"
        }
    });
</script>
</body>
</html>

6.事件绑定

6.1基本说明

  1. 使用v-on指令进行事件处理,比如v-on:click表示处理鼠标点击事件
  2. 事件调用的方式定义在vue对象声明的的methods节点中
  3. v-on:事件名可以绑定指定事件
  4. 官方文档:事件处理 — Vue.js (vuejs.org)

6.2应用实例

需求:演示Vue事件绑定操作

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>事件处理</title>
</head>
<body>
<!--视图-->
<div id="app">
    <h1>{{message}}</h1>
    <!--
    1.v-on:click 表示要给button元素绑定一个click事件、
    2.sayHi() 表示绑定的方法,它在方法池 methods{}中定义
    3.底层仍然是dom处理
    -->
    <button v-on:click="sayHi()">点击输出</button>
    <button v-on:click="sayOk()">点击输出</button>
</div>
<script src="vue.js"></script>
<script>
    //创建vue实例
    let vm = new Vue({
        el: "#app",//挂载到 div上,el是element的简写
        data: {//数据池 -model中的数据
            message: "Vue事件处理的案例"
        },
        // 1.methods 属性,对应的值是对象{}
        // 2.在methods 的{}中,可以写很多方法,可以理解为 “方法池”
        methods: {
            sayHi() {//方法的简写
                console.log("hi,金角大王~~");
            },
            sayOk() {
                console.log("ok,银角大王~~");
            }
        }
    });
    console.log("vm==>", vm);
</script>
</body>
</html>
image-20230107220714643

6.3分析事件处理的机制

分析一下上面6.2的案例,Vue对象实例是怎么找到methods{}中的方法的?换而言之,声明的方法是怎么挂载到button元素上的?

我们在控制台输出vue对象,在vue对象下可以看到该实例对象中声明的方法:

image-20230107222813444

在vue实例的子属性$el-->childNodes下可以看到vue对象挂载元素(这里为div)的子元素列表:

其中序号为2的元素就是绑定sayHi()方法的button元素,序号为4的元素就是绑定sayOk()方法的button元素。

image-20230107221136672

展开其中一个元素,可以看到该button元素下面有非常多的方法属性,同样可以通过v-on给这些属性指定方法。

image-20230107221626874

上面v-on:onclick属性值为null,是因为浏览器没有显示。如果我们使用原生的js绑定方法,就可以在浏览器中看到了

v-on:click底层还是dom编程,最终还是会变成onclick()

改为原生js绑定onclick方法:image-20230107222249083

浏览器控制台输出:

image-20230107222429626image-20230107222439659

总结:在vue对象中声明methods{}属性时,vue实例会创建method{}中的对应方法,使用v-on指令绑定事件,method{}中对应的方法就会被挂载到对应的元素中。

6.4注意事项和使用细节

  1. 如果方法没有参数,可以省略()(需要浏览器支持)

  2. v-on 指令的简写形式@ (需要浏览器支持)

    image-20230107224052330
  3. 在挂载的元素中就可以看到可以绑定的事件

    image-20230107224243568

6.5练习

6.5.1练习1

如图,点击按钮,次数联动变化

  • 当用户点击+1按钮时,次数+1

  • 当用户点击+2按钮时,次数+2

  • 分别使用常规方法和表达式形式完成

    image-20230107224531286

法一:监听事件

可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件绑定练习01</title>
</head>
<body>
<div id="app">
    <h1>{{message}}</h1>
    <!--这里的count是数据池data{}的count-->
    <button @click="count +=1">点击+1</button>
    <button @click="count +=2">点击+2</button>
    <p>你的按钮被点击了{{count}}次</p>
</div>
<script src="vue.js"></script>
<script>
    let vm = new Vue({
        el: "#app",
        data: {
            message: "演示Vue事件绑定操作",
            count: 0
        }
    });
</script>
</body>
</html>

思考:为什么@click="count +=2"中的count可以修改数据池中的count呢?

因为vue实例已经挂载到@click="count +=2"对应的button节点的父节点div上了,当运行时,发现count+=2并不是方法,就会自动去被挂载的vue实例的数据池中寻找count数据


法二:事件处理方法

然而许多事件处理逻辑会更为复杂,所以直接把 JavaScript 代码写在 v-on 指令中是不可行的。因此 v-on 还可以接收一个需要调用的方法名称。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件绑定练习01</title>
</head>
<body>
<div id="app">
    <h1>{{message}}</h1>
    <button @click="addOne">点击+1</button>
    <button @click="addTwo">点击+2</button>
    <p>你的按钮被点击了{{count}}次</p>
</div>
<script src="vue.js"></script>
<script>
    let vm = new Vue({
        el: "#app",
        data: {
            message: "演示Vue事件绑定操作",
            count: 0
        },
        methods: {
            addOne() {
                this.count += 1;
            },
            addTwo() {
                this.count += 2;
            }
        }
    });
</script>
</body>
</html>

6.5.2练习2

如图,根据用户的输入,弹窗显示内容

  • 用户可以在输入框输入内容

  • 点击按钮,可以显示输入框的内容

    image-20230107224839431
<!DOCTYPE html>
<html lang="en"
      xmlns:v-model="http://www.w3.org/1999/xhtml"
      xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>事件绑定练习2</title>
</head>
<body>
<div id="app">
    <h1>{{message}}</h1>
    书名:<input type="text" v-model:value="bookname"/>
    <button v-on:click="show">点击显示输入框的内容</button>
</div>
<script src="vue.js"></script>
<script>
    let vm = new Vue({
        el: "#app",
        data: {
            message: "演示Vue事件绑定操作",
            bookname: "三国演义" //初始值
        },
        methods: {
            show() {
                alert(this.bookname);
            }
        }
    });
</script>
</body>
</html>
image-20230107231710616
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • vue3+TS 自定义指令:长按触发绑定的函数
    vue3+TS 自定义指令:长按触发绑定的函数而然间看到一个在vue2中写的长按触发事件的自定义指定,想着能不能把他copy到我的vue3项目中呢。编写自定义指令时遇到的几个难点1.自定义指令的类型在ts中写任何东西都要考虑到类型的问题,自定义指令的类型问题依然存
    03-08
  • Vue生命周期 vue生命周期几个阶段
    Vue生命周期 vue生命周期几个阶段
    官网解释一、Vue的生命周期Vue 实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom - 渲染、更新 - 渲染、卸载 等⼀系列过程,称这是Vue的⽣命周期。Vue2生命周期:1.beforeCreate(创建前)数据观测和初始化事件还未开始,此时 dat
    03-08
  • vue 中安装并使用echart
    vue 中安装并使用echart
    本文为博主原创,转载请注明出处:1.安装echart 依赖:  安装命令: npm install echarts --save  在vscode 的终端窗口进行执行,如图所示:   执行完之后,查看 项目中的echart 版本依赖是否添加成功:  package-lock.json 中有具体的echart 依赖
    03-08
  • Vue + Element 自定义上传封面组件
    Vue + Element 自定义上传封面组件
    前一段时间做项目,频繁使用到上传图片组件,而且只上传一个封面,于是想着自定义一个图片封面上传组件。先来看一下效果:                      第一张图片是上传之前,第二张图片是上传成功后,第3张图片是鼠标放上去之后的效果! 首先整理需
    03-08
  • 基于ZR.VUE 前端的改造,页面刷新报错
     问题描述:前后端分离开发,分开部署. 页面刷新 直接报404 错误的解决办法提示:  先在 .env.development 中 配置 VUE_APP_BASE_API , 将 '/' 替换为 后端地址 'http://localhost:8888/'如果是对应的发布的正式环境,也要修改  .env.production 的VUE_APP_
    03-08
  • Vue3 企业级优雅实战 - 组件库框架 - 9 实现组
    上文搭建了组件库 cli 的基础架子,实现了创建组件时的用户交互,但遗留了 cli/src/command/create-component.ts 中的 createNewComponent 函数,该函数要实现的功能就是上文开篇提到的 —— 创建一个组件的完整步骤。本文咱们就依次实现那些步骤。(友情提示
    03-08
  • vue-3 this概念
    一、this概念官方是这样说的:在 setup()内部,this 不会是该活跃实例的引用因为 setup() 是在解析其它组件选项之前被调用的,所以 setup() 内部的 this 的行为与其它选项中的 this 完全不同这在和其它选项式 API 一起使用 setup() 时可能会导致混淆啥意思呢
    03-08
  • vue3和百度地图关键字检索 定位 点击定位
    vue3和百度地图关键字检索 定位 点击定位
    效果图在index.html中引入百度地图开放平台  去申请你的ak 非常的简单可以自己百度 一下!-- 这个用官网给的有好多警告 更具百度的把 https://api.map.baidu.com/getscript?v=2.0ak=xxxxxxxxxxxxxxxxxxxxx 换为这个就没有那么多 报错了 --scripttype="text/j
    03-08
  • Vue集成lodop插件实现打印功能 vue打印console
    Vue集成lodop插件实现打印功能 vue打印console
    目录VUE简单使用lodop1.创建LodopFuncs.js文件2.在打印功能vue页面引入LodopFuncs3.执行打印方法4.打印接口函数官网样例说明5.完整页面示例VUE 集成LODOP插件打印Lodop、C-Lodop使用说明及样例http://www.lodop.net/LodopDemo.htmlVUE简单使用lodop1.创建Lodo
    03-08
  • Vue3+TypeScript 项目中,配置 ESLint 和 Prett
    接上篇:从0搭建vite-vue3-ts项目框架:配置less+svg+pinia+vant+axios文档同步项目gitee:https://gitee.com/lixin_ajax/vue3-vite-ts-pinia-vant-less.git 一、Eslint:用于检测代码安装eslint相关依赖yarn add eslint eslint-plugin-vue @typescript-esli
    03-08
点击排行