二、vue之初体验-案例体验

news2024/12/23 13:12:09

一、案例体验一:动态展示Hello World数据

<!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="lib/vue.js"></script>
    <script>
      const app = Vue.createApp({
        template: `<h2>Hello World</h2>`,
      });
      app.mount("#app")
    </script>
  </body>
</html>

问题来了,我们怎么才能动态展示template模板里面的hello world内容呢?比如说我要展示hello Vue咋办呢?直接去改template是不是不方便?

我们在创建app对象的时候除了给它加一个template属性以外,我们还可以继续给他添加属性,比如说添加一个data属性。这里的属性不是随便填写的,得根据vue的api而来。

并且要求我们当前这个data是一个函数(要求的不要问为什么哈),而且这个函数必须要返回一个对象。

那此时我们现在是不是想让title的值展示到template这个里面呢?那这个我们如何做到呢?

 我们需要用到插值语法:将某一个对应的属性的值插入到template里面的h2标签里面去。

那插值语法到底是怎么写呢?

# 插值语法:双大括号里面写下对应属性的名称
{{对应属性的名称}}

此时template模板里面的h2里面的内容是不是变成你title属性的值啦?

  如果我想改变hello world,只需要改变title的值就可以了。或者新增一个属性message。

页面展示 :

 总结:可以将数据放到data这一个属性里面,并且这个属性的要求是一个函数,这个函数要求返回一个对象,这个对象里面所有的属性都是可以通过插值语法插入到模板里面。

实战思路:先去我们的服务器里面请求一些数据存放在data里面,然后通过插值语法动态的将数据放到模板里面。整个过程里面,没有手动的操作过DOM。

咱们以前是怎么操作来着的?先获取元素等等...现在不需要了吧。其实这就是一个声明式编程。我只告诉你我这边要显示什么东西,至于怎么去操作DOM,你这个框架替我去完成。

二、案例体验二:展示列表的数据

正式开发的时候,我们这里message是不是一般拿到的基本都是列表的数据,所以我们需要把列表的数据动态的展示到template这个h2标签里面来。

 此时我们这样子写能以列表的形式展示吗?回答当然是不行的。

这样子是直接拿到了数组,把数组转换成了字符串,直接把字符串展示出来了。

效果: 

 那有小伙伴们说我可以这么写:

这样子可以实现吗 当然可以。

 那如果数据有几十条几百条甚至几千条数据呢?你也这么复制粘贴,然后按数组索引取值吗?

我们可以通过v-for 这个语法去遍历movies数据,然后将item通过插值语法插入进去。

总结用法:v-for可以遍历data这个对象里面的数据(数组),然后再通过插值语法将每个属于item插入进来。

三、案例体验三:计数器功能实现

如果我们希望实现一个计数器的案例:

  • 点击+1,那么内容会显示数字+1;
  • 点击-1,那么内容会显示数字-1;

我们先不去实现功能,先去把界面写出来。 

目前我们是不是把想要展示的数字抽离出来了?所以只要我们点加号或者减号之后我们只要去改变counter这个值就好了。一旦counter这个值发生变化,这个界面就会自动去刷新。

目前我们点击这个加号减号是没有反应的。 

在我们原生的DOM里面如果你想做上面描述的操作,你得先拿到加号减号这个元素,监听他的点击,监听回调函数在里面做对应的操作?

但是在vue里面,我首先先监听button点击,监听到点击之后必然会执行某些操作。所以我们得有一个函数和我们监听事件绑定在一起,所以我们在Vue创建的对象app里新增另外一个属性methods,它也是一个对象.

我们目前是需要把methods对象里面的方法和button按钮绑定在一起。只要一旦绑定在一起,我们去点击button按钮,就会让他自动去执行该按钮绑定的函数。然后在这个函数里面我们只要去改变counter的值就好了。

思路都理好了。那我们怎么把abc函数和cba函数绑定到两个按钮上面去呢?

很简单,我们只要在按钮上面绑定点击事件 @click="函数名"

那我们还剩最后一步,我怎么在abc函数里实现每点击一次就给counter+1呢?又怎么在cba函数里实现每点击一次就给counter-1呢?

下面上代码:

很多同学可能一开始接触这个有点疑问,

为什么这里的this能拿到上面这个对象呢?因为这个是vue底层帮你完成的(后面讲原理)。

<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="./lib/vue.js"></script>
    <script>
      const app = Vue.createApp({
        template: `
          <button @click="decrement">-1</button>
          <h2>当前计数: {{counter}}</h2>
          <button @click="increment">+1</button>
        `,
        data: function () {
          return {
            counter: 0,
          };
        },
        methods: {
          increment: function () {
            this.counter += 1;
          },
          decrement: function () {
            this.counter--;
          },
        },
      });

      app.mount('#app');
    </script>
  </body>
</html>

 总结:

  1. 先将counter放到template里面的h2标签里
  2. methods对象里实现2个函数自加一 自减一
  3. 将按钮绑定点击事件   @click="函数名"

四、案例体验四:计数器功能实现(重构)

上面我们讲到了vue三条案例体验,咱们在写代码的时候,是不是感觉哪里写的特别变扭?

没错,就是我们在写template的时候。

<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="./lib/vue.js"></script>
    <script>
      const app = Vue.createApp({
        template: `
          <button @click="decrement">-1</button>
          <h2>当前计数: {{counter}}</h2>
          <button @click="increment">+1</button>
        `,
        data: function () {
          return {
            counter: 0,
          };
        },
        methods: {
          increment: function () {
            this.counter += 1;
          },
          decrement: function () {
            this.counter--;
          },
        },
      });

      app.mount('#app');
    </script>
  </body>
</html>

如果我们能放在这里编写效率是不是变高?然后把下面写的template里面的内容删掉。

<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>

    <h2>当前计数: {{counter}}</h2>
    <button @click="decrement">-</button>
    <button @click="increment">+</button>

    <script src="./lib/vue.js"></script>
    <script>
      const app = Vue.createApp({
        template: ``,
        data: function () {
          return {
            counter: 0,
          };
        },
        methods: {
          increment: function () {
            this.counter += 1;
          },
          decrement: function () {
            this.counter--;
          },
        },
      });

      app.mount('#app');
    </script>
  </body>
</html>

但是我们这样子去写的时候,前端页面展示如下:

所以目前存在一个问题:你怎么把上面写的内容跟下面的template联系在一起?因为下面这个template是上面内容的模板。

我们今天就演示一个最简单的方法。

我们直接把下面的template删掉,删掉之后我们目前还有一个问题,带会vue渲染的时候,他知道要渲染谁吗?不知道。

我们可以把上面的内容剪切到id=app的div标签里面。

<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">
      <h2>当前计数: {{counter}}</h2>
      <button @click="decrement">-</button>
      <button @click="increment">+</button>
    </div>

    <script src="./lib/vue.js"></script>
    <script>
      const app = Vue.createApp({
        data: function () {
          return {
            counter: 0,
          };
        },
        methods: {
          increment: function () {
            this.counter += 1;
          },
          decrement: function () {
            this.counter--;
          },
        },
      });

      app.mount('#app');
    </script>
  </body>
</html>

现在功能是不是实现了?

那这样子做代表的意思是啥呢?为什么可以这么操作呢?

 TODO:

当你有template,并且template里面是有内容的时候,vue会自动渲染template里面的东西,并且会把你原来id=app的div里面的内容替换掉。

如果你没有template,vue会自动渲染你id=app的div里面的内容,并且也会解析counter。

我们浏览器F12看下,

效果:


我们加上template看下效果: 

 

是不是替换掉啦? 

总结:所以,我们template其实是可以选到上面这个位置里来的,当你写在上面的时候,你在下面template里面就没必要慢慢自己去写了。

所以这个时候我们代码结构是这样子的:

  • 模板
  • data定义数据
  • method定义函数

 还有其他方法,后续我们再详细讲解哈~

通过两篇文章,大家能够体验到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>
    <h2>当前计数: <span class="counter"></span></h2>
    <button class="add">+1</button>
    <button class="sub">-1</button>

    <script>
      // 1. 获取dom
      const h2El = document.querySelector('h2');
      const counterEl = document.querySelector('.counter');
      const addBtnEl = document.querySelector('.class');
      const subBtnEl = document.querySelector('.sub');

      // 2. 定义一个变量记录数据
      let counter = 100;
      counterEl.textContent = counter;

      //  2. 监听按钮的点击
      addBtnEl.onclick = function () {
        counter++;
        counterEl.textContent = counter;
      };
      subBtnEl.onclick = function () {
        counter--;
        counterEl.textContent = counter;
      };
    </script>
  </body>
</html>

比对:

原生的开发模式(命令式编程):我要想达到一个目的,我得做哪些操作。

  1. 首先我想要改变counter这个值,得先拿到这个元素el(document.querySelector(".counter"))。 
  2. 监听点击 - 获取元素 - 监听按钮的点击。
  3. 真正发生点击 - 改变counter++, 将最新的counter设置dom上面。

Vue(声明式编程)

  1. 声明一个模板 h2->{{counter}} ,button 点击绑定事件
  2. 声明data: counter -> 0, 声明methods

六、MVVM模型

 

 

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

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

相关文章

Java开发 - 配置中心初体验

目录 前言 配置中心介绍 什么是配置中心 Nacos配置中心 数据结构 命名空间 分组 服务 配置中心添加配置 读取配置 本地添加依赖 本地添加配置 测试 结语 前言 前文讲了ELK&#xff0c;ELK说简单也简单&#xff0c;说复杂也复杂&#xff0c;但说实话&#xff0c;微…

【Linux】通过网络版计算器来认识协议

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

动力节点Springsecurity视频笔记06-13基于数据库的方法授权

6 密码处理 6.1 为什么要加密&#xff1f; csdn 密码泄露事件 泄露事件经过&#xff1a;https://www.williamlong.info/archives/2933.html 泄露数据分析&#xff1a;https://blog.csdn.net/crazyhacking/article/details/10443849 6.2加密方案 密码加密一般使用散列函数&a…

二极管基础知识

1、二极管是常用的半导体器件、由P/N结组成。 有插件类和贴片类两大封装&#xff0c;常用的插件封装有DO-15、D0-27、DO-35、DO-41、TO-220等&#xff0c;常用的贴片封装有SMA、SMB、SMc、s0D-123、SOD-323、TO-277等。 按反向恢复时间分类有&#xff0c;普通〈慢恢复&#xff…

java的validation框架(参数校验)

一.bean validation和hibernate validator参数校验常用约束注解&#xff1a; 空值校验类&#xff1a;Null&#xff0c;NotNull&#xff0c;NotEmpty&#xff0c;NotBlank等 范围校验类&#xff1a;Min&#xff0c;Size&#xff0c;Digits&#xff0c;Future&#xff0c;Negati…

Web Components 技术分析

简括&#xff1a; Web Components 基于四个主要的规范&#xff1a; Custom Elements&#xff0c;Shadow DOM&#xff0c;HTML Templates 和 HTML Imports。 Custom Elements 可以让开发人员创建自定义的 HTML 标签。 Shadow DOM 可以让开发人员将样式和行为封装到自定义元素内…

ASM字节码处理工具原理及实践(二)

0. 相关分享 ASM字节码处理工具原理及实践&#xff08;一&#xff09; 上一篇讲了ASM的简介、导入&#xff0c;以及字节码文件结构&#xff0c;并给出了ASM通过ClassVisitor对class进行访问的基础实战。本篇将进入MethodVisitor&#xff0c;尝试对方法进行访问、生成、转换。…

29.Linux网络编程

把昨天的 第二天的内容说一下&#xff0c;复习一下&#xff0c;第二天 讲的东西不算多&#xff0c;但是有两个作业题来写一写&#xff0c; 大致浏览一下&#xff0c;三次握手 四次挥手的过程&#xff0c;大家有没有画一下&#xff1f; 能画出来吗&#xff1f;同学们&#xff0…

前后端分离开发、Yapi、Swagger、项目部署

一、前后端分离开发 1.1、介绍 前后端分离开发&#xff0c;就是在项目开发过程中&#xff0c;对于前端代码的开发由专门的前端开发人员负责&#xff0c;后端代码则由后端开发人员负责&#xff0c;这样可以做到分工明确、各司其职&#xff0c;提高开发效率&#xff0c;前后端代…

RocketMQ单机环境搭建测试+springboot整合

1.资源下载 官网&#xff1a;下载 | RocketMQ 这里选择使用编译后可以直接用的 下载后解压&#xff1a;略 2.更改配置 主要是更改 conf/broker.conf 的配置&#xff0c;记得添加上下面这几行&#xff0c;否则消息发送失败 autoCreateTopicEnabletrue # 支持自动创建topic…

浅谈日出日落的计算方法以及替代工具 - 日出日落 API

引言 如果你想知道精确的日落日出时间&#xff0c;又或者你想设计一个日出日落时间查询的应用&#xff0c;又或者你只是好奇点进来了&#xff0c;还是可以过来围观一下涨涨知识&#xff0c;今天想跟大家聊一聊的是日出日落的计算方法以及替代工具 - 日出日落 API 。 日出日落…

大数据=SQL Boy,SQL Debug打破SQL Boy 的僵局

网上经常盛传 大数据sql boy&#xff0c;后端开发crud boy&#xff0c;算法工程师调参boy 在大数据领域也工作了好几年了&#xff0c;确实大数据开发&#xff0c;很多工作就是写sql&#xff0c;hive sql、spark sql、flink sql等等sql 一、背景&#xff1a; 但是经常有这样一…

NODEJS安装和vue安装及运行方法以及出现Cannot find module ‘node-sass‘ Require stack问题解决方法

安装nodejs 官网下载&#xff1a; https://registry.npmmirror.com/binary.html?pathnode/选择要下载的版本 一般建议下载msi 选择自己的安装位置一直下一步即可完成 检查一下是否安装成功 打开cmd&#xff0c;输入如下指令 node -vnpm -v输出了版本号就说明安装成功了 …

GCM与CCM的动作过程

CCM CCM&#xff08;Counter with CBC-MAC&#xff09;是一种基于对称加密算法的认证加密&#xff08;Authenticated Encryption&#xff09;模式&#xff0c;结合了CBC-MAC&#xff08;Cipher Block Chaining Message Authentication Code&#xff09;用于消息认证和CTR&…

[java聊天室]服务器发送消息给客户端守护线程同步锁(三)

守护线程 守护线程也称为:后台线程 守护线程是通过普通线程调用setDaemon(boolean on)方法设置而来的,因此创建上与普通线程无异.守护线程的结束时机上有一点与普通线程不同,即:进程的结束.进程结束:当一个进程中的所有普通线程都结束时,进程就会结束,此时会杀掉所有正在运行…

嵌入式Linux(2):将Helloworld驱动编译到内核

文章目录 分析一个例子仿写一个例子&#xff08;需要编译成.ko的&#xff09;写三个文件编辑上一级目录的Makefile文件编辑上一级目录的Kconfig文件make menuconfig进行配置 烧录到开发板上 分析一个例子 例子&#xff1a; source "drivers/redled/Kconfig" config…

简单分享微信怎么添加报名链接的步骤

最近看到很多小伙伴都在问有没有简单的报名链接制作办法&#xff0c;因为最近是暑期活动开展的前期&#xff0c;需要用到很多报名链接&#xff0c;希望可以直接通过微信小程序进行报名&#xff0c;扫一扫微信小程序的二维码就可以进入报名页面&#xff0c;然后制作步骤也是简单…

残差 Gabor 卷积网络和 FV-Mix 指数级数据增强策略用于手指静脉识别

论文背景 手指静脉识别系统的性能受到手指静脉训练样本不足的限制&#xff0c;导致特征学习不足和模型泛化能力弱&#xff1a;DCNN 需要大量的数据来学习更抽象的语义信息进行分类。对于指静脉识别&#xff0c;由于每个类别只包含少量样本&#xff0c;极易出现过拟合。原因之一…

MinIO快速入门

一、MinIO概述 官网地址&#xff1a;http://www.minio.org.cn/ 文档地址&#xff1a;http://docs.minio.org.cn/docs/ MinIO是一款基于Apache License v2.0开源协议的分布式文件系统&#xff08;或者叫对象存储服务&#xff09;&#xff0c;可以做为云存储的解决方案用来保存海…

如何借助测控终端实现设备远程运维?

随着物联网技术的发展&#xff0c;数字化越来越重要。数据是新的生产要素&#xff0c;是基础性资源和战略性资源&#xff0c;也是重要生产力。因此许多企业纷纷转型智慧工厂&#xff0c;但老旧的设备无法获取相应的数据&#xff0c;更换老旧设备的成本又太高&#xff0c;就无法…