Vue 的基础知识 - 判断, 循环, 事件, 通信

news2024/11/28 14:29:41

目录

1. 了解 Vue 七大常用属性

2. 文本插值

2.1 v-bind 绑定元素

3. 判断

4. 循环

5. 事件

6. 双向绑定

7. 自定义组件

8. Axios 异步通信

8.1 什么是Axios

8.2 为什么要使用 Axios

8.3 Axios 的简单应用

8.4 Vue 的生命周期


1. 了解 Vue 七大常用属性

1. el 属性 : 用来指示vue编译器从什么地方开始解析 vue的语法, 可以说是一个占位符.

2. data 属性 : 用来组织从view中抽象出来的属性, 可以说将视图的数据抽象出来存放在data中.

3. template属性 : 用来设置模板, 会替换页面元素.

4.methods属性 : 放置页面中的业务逻辑, js方法一般都放置在methods中, 用来写方法.

5. render属性 : 创建真正的Virtual Dom. 

6. computed属性 : 根据已经存在的属性计算出新的属性,对于同样的数据,会缓存。当其依赖属性的值发生变化是,这个属性的值会自动更新,与之相关的DOM部份也会同步自动更新. 

7. watch侦听属性 : watch:function(new,old){} 监听data中数据的变化. 

2. 文本插值

语法 : {{msg}}

文本插值是最基本的数据绑定形式. 双大括号标签会被替换为相应组件中的 msg 属性的值. 同时每次 msg 属性更改时它也会同步更新.

<div id="app">
    {{msg}}
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>

<script>
    var vm = new Vue({
        el: "#app",
        data:{
            msg: "hello Vue"
        }
    });
</script>

2.1 v-bind 绑定元素

除了 {{}} 可以绑定元素外, 还可以使用 v-bind 来绑定元素.

<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<div id="app">
    <span v-bind:title="msg">鼠标悬停过来几秒钟</span>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            msg: "can not see me"
        }
    });
</script>

3. 判断

打开开发者工具,修改 vm 对象中 type 属性的值, 感受条件判断的用法.

<div id="app">
    <h1 v-if="type==='A'">A</h1>
    <h1 v-else-if="type==='B'">B</h1>
    <h1 v-else>C</h1>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>
<script>
    var vm = new Vue({
        el: "#app",
        data:{
            type: 'A'
        }
    });
</script>

4. 循环

打开开发者工具, 给数组添加数据, 感受循环的用法. 此处的 v-for 指令和我们学过的 foreach 循环很像.

<div id="app">
    <li v-for="item in items">
        {{item.msg}}
    </li>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>
<script>
    var vm = new Vue({
        el: "#app",
        data:{
            items: [
                {msg: 'hello java'},
                {msg: 'hello Linux'},
                {msg: 'hello vue'}
            ]
        }
    });
</script>

 v-for 还能获取元素的下标 : 

<div id="app">
    <li v-for="(item,index) in items">
        {{item.msg}}--{{index}}
    </li>
</div>

5. 事件

使用 v-on 指令绑定事件.

原先我们是通过 οnclick="function" 这样绑定一个事件, 但是在 Vue 中, 方法是必须定义在 Vue 的 Methods 对象中, onclic 是绑定不到的, 所以需要使用到 v-on 来绑定.

<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<div id="app">
    <button v-on:click="sayHi">点我试试</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            message: "hello, vue"
        },
        methods: { // 方法必须定义在 Vue 的 Method 对象中
            sayHi: function() {
                alert(this.message);
            }
        }
    });
</script>

6. 双向绑定

什么是双向绑定 ?

上一篇博客已经详细讲解了 MVVM 思想, 即当数据发生变化的时候, 视图也就发生了变化, 当视图发生变化的时候, 数据也会跟着同步变化, 这个就是 Vue.js 的精髓之处.

在表单中使用双向数据绑定>>>

我们可以用 v-model 指令在表单 <input>,  <radio>, <select> 等元素上创建双向数据绑定. 他会根据控制件类型自动选取正确的方法来更新元素. 他负责监听用户的输入事件以更新数据, 并对一些极端场景进行一些特殊处理.

注意 : 

v-model 会忽略所有表单元素的 value, checked, selected 特征的初始值而总是将 Vue 的实例的数据作为数据来源. 我们应该通过 JavaScript 在组件的 data 选项中声明初始值!

【文本框】

<div id="app">
    <!--  绑定 msg,View 控制 Model 改变 -->
    输入的文本:<input type="text" v-model="msg"> {{msg}}
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            msg: "123"
        }
    });
</script>

【单选框】

<div id="app">
    性别 :
    <input type="radio" name="sex" value="男" v-model="checked"> 男
    <input type="radio" name="sex" value="女" v-model="checked"> 女

    <p>
        选中了: {{checked}}
    </p>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            checked: ''
        }
    });
</script>

【下拉框】

<div id="app">
    <select v-model="selected">
        <option value="" disabled>--请选择--</option>
        <option>A</option>
        <option>B</option>
        <option>C</option>
    </select>
    <span>value: {{selected}}</span>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>
<script>
    var vm = new Vue({
        el: "#app",
        data: {
            selected: ''
        }
    });
</script>

【注意】如果 v-model 表达式的初始值未能匹配任何选项, <select> 元素将被渲染为 "未选中" 状态. 在 IOS 中, 这会使用户无法选择第一个选项. 因为这样的情况下, IOS 不会触发 change 事件. 因此, 更推荐像上面这样提供一个值为空的禁用选项. 

7. 自定义组件

Vue 自定义组件的简单应用 : 

<div id="app">
    <my-component v-for="item in items" v-bind:cpt="item"></my-component>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">
</script>
<script>
    // 定义一个 Vue 组件 component
    Vue.component("my-component",{
        props: ["cpt"], // 传递参数
        template: '<li>{{cpt}}</li>' // 组件模板
    });
    var vm = new Vue({
        el: "#app",
        data: {
            items: ["Java","Linux","Vue"]
        }
    });
</script>
  • Vue.component() : 注册组件
  • my-component : 自定义组件的名字
  • template : 组件的模板

【注意】使用 props 属性传递参数

上述代码中, 通过循环遍历 data 中 items 的数据时, 无法直接被自定义组件中的模板拿到, 于是要使用 v-bind:指令来绑定每一个元素, 而且需要通过 props 属性来传递参数, 否则 template 模板拿不到每一个 item 元素. 

8. Axios 异步通信

8.1 什么是Axios

Axios 是一个开源可以用在浏览器端和 NodeJS 的异步通信框架, 它的主要作用就是实现 AJAX 异步通信, 其功能特点如下 : (官网)

  • 从浏览器创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API  [JS 中链式编程]
  • 拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 自动转换JSON数据
  • 客户端支持防御 XSRF

8.2 为什么要使用 Axios

因为 Vue.js 是一个视图框架, 并且严格遵守 SoC (关注度分离原则), 所以 Vue.js 并不包含 AJAX 的通信功能, 为了解决通信问题, 作者单独开发了一个名为 vue-resource 的插件, 不过在进入 2.0 版本后停止了对该插件的维护并推荐了 Axios 框架. 少用 jQuery, 因为它操作 DOM 太频繁 !

8.3 Axios 的简单应用

由于开发的接口大部分都是采用 JSON 格式, 可以先在项目里模拟一段 JSON 数据, 创建一个名为 data.json 的文件并填入以下内容 : 

{
  "name": "花果山水帘洞",
  "url": "https://www.baidu.com/",
  "address": {
    "street": "新安街道",
    "city": "广东深圳",
    "country": "中国"
  },
  "links": [
    {
      "name": "B站",
      "url": "https://www.bilibili.com/"
    },
    {
      "name": "4399",
      "url": "https://www.4399.com/"
    },
    {
      "name": "百度",
      "url": "https://www.baidu.com/"
    }
  ]
}

引入 Axios :

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<div id="app">
    <div>{{result.name}}</div>
    <div>{{result.address.street}}</div>
    <a v-bind:href="result.url">点我</a>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    var vm = new Vue({
        el: "#app",
        // data 方法
        data() {
            return{
                // 请求返回的参数, 必须和 Json 字符串一样
                result: {
                    name: null,
                    address: {
                        street: null,
                        city: null,
                        country: null
                    },
                    url: null
                }
            }
        },
        mounted() {
            // 钩子函数, 链式编程, (JavaScript ES6 新特新)
            axios.get('../data.json').then(response=>(this.result=response.data));
        }
    });
</script>

说明 : 

1. 使用了 v-bind 将 a.herf 的属性值与 Vue 实例中的数据进行绑定.

2. 使用 axios 框架的 get (post)  方法请求 Ajax 并自动将数据封装进了.

3. data 中的数据结构必须要和 Ajax 响应回来的数据格式匹配.

4. 使用箭头函数, 需要将 IDEA 中 JavaScript 改为 ES6 新特性.

当浏览器访问页面的时候, 实际上是存在一个闪烁问题, 它会先加载模板, 再渲染数据, 只是这个过程网速太快, 唰的一下就渲染出数据了, 所以看不太出来, 这需要结合 Vue 的生命周期来理解. 

解决 Vue 闪烁问题 :

<style>
    [v-clock]{
        display: none
    }
</style>

<div id="app" v-clock>
    <div>{{result.name}}</div>
    <div>{{result.address.street}}</div>
    <a v-bind:href="result.url">点我</a>
</div>

理解上述 Axios 中 mounted 钩子函数就要联系到 Vue 的生命周期了 >>

8.4 Vue 的生命周期

       Vue 实例有一个完整的生命周期, 也就是从开始创建, 初始化数据, 编译模板, 挂载 DOM, 渲染 -> 更新 -> 渲染, 卸载等一系列过程,  我们称之为 Vue 的生命周期.  通俗说就是 Vue 实例从创建到销毁的过程, 就是生命周期. 

       在 Vue 的整个生命周期中, 它提供一系列的事件, 可以让我们在事件触发时注册 JS 方法, 可以让我们用自己注册的 JS 方法控制整个大局. 在这些事件响应方法中的 this 直接指向的是 Vue 的实例. 

上述 Vue 的生命周期看起来相当复杂难理解, 如果想要理解透彻, 可以看这位哥们的文章.​​​​​​​

理解上述 Axios 的应用主要是理解以下模块 : 

      mounted 钩子所做的事情其实就类似于 jQuery 的前端发送 Ajax 请求给后端, 然后再通过 data() 中的 return 实时监听并更新 DOM. return 中的参数只需要保持和 Json 字符串一样即可 (data.json 中的数据可全部写在 return 中, 也可以写一部分, 但格式要保持 json 格式)

      而 jQuery.ajax 来向后端请求数据的话, 请求到的数据还需要频繁操作 DOM 树进行添加, 这样对比起来, 操作简单了很多.


本文通过B站狂神的视频所学, 感兴趣的可以找狂神说​​​​​​​的视频进行学习, 他的视频很有学习的价值, 感谢狂神~

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

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

相关文章

Qt扫盲-Bar柱状图理论

Bar柱状图理论 一、QAbstractBarSeries1. 常用设置2. 管理 BarSet 二、QBarSerie 和 QHorizontalBarSeries1. 垂直柱状图2. 水平柱状图 二、QPercentBarSeries 和 QHorizontalPercentBarSeries1. 垂直比例图2. 水平比例图 三、QStackedBarSeries 和 QHorizontalStackedBarSerie…

忠诚之源:如何获得铁粉?

文章目录 一、铁粉二、如何吸引和留住铁粉的想法2.1 了解你的目标铁粉2.2 提供有价值的内容2.3 建立良好的关系2.4 持续优化和创新 三、具体可采用的一些方法3.1 提供优质内容3.2 社交媒体互动3.3 创建独特的品牌形象3.4 提供特殊待遇和奖励3.5 参与社区和活动3.6 持续互动和更…

如何把视频语音转换成文字,分享给大家几个免费的方法!

在日常工作和学习中&#xff0c;有时需要将视频中的语音转录为文字&#xff0c;以便整理成文稿或进行其他用途。手动打字效率低下且耗时费力&#xff0c;那么如何快速将语音转换为文字呢&#xff1f;下面介绍几种简单高效的方法&#xff0c;其中之一是使用记灵在线工具。 方法…

PHP的流程控制语句

一.流程控制语句 1.if语句 PHP的if语句格式如下 if(表达式) 语句; 如果表达式的值为真&#xff0c;那么久顺序执行语句&#xff1b;否则&#xff0c;就会跳过该条语句&#xff0c;再往下执行。如果要执行的语句不指一条则用{}&#xff0c;{}被称为语句组&#xff0c;格式如…

Immer编写简洁的更新state逻辑

react官网推荐库use-immer&#xff1a;https://www.npmjs.com/package/use-immer 引入&#xff1a;import { useImmer } from "use-immer"; 优点&#xff1a; 简化代码: 只需要关注需要变动的部分&#xff0c;而 immer 本身将在后台处理其余部分。学习成本和替换代…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用

查看原文>>>双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用 目录 第一讲、DNDC模型介绍 第二讲、DNDC初步操作 第三讲、遥感和GIS基础 第四讲、DNDC气象数据 第五讲、DNDC土地数据 第六讲、DNDC土壤数据 …

【C语言】算法学习·Dijkstra算法详解

目录 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法的基本思想 Dijkstra贪心策略 完美图解 伪代码详解 完整代码 算法解析及优化拓展 ​使用优先队列的完整代码 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法是解决**单源最短路径**问题的**贪心算法** …

2021年国赛高教杯数学建模C题生产企业原材料的订购与运输解题全过程文档及程序

2021年国赛高教杯数学建模 C题 生产企业原材料的订购与运输 原题再现 某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料,总体可分为 A&#xff0c;B&#xff0c;C 三种类型。该企业每年按 48 周安排生产&#xff0c;需要提前制定 24 周的原材料订购和…

如何在 javascript 中按属性值查找数组中的对象

文章目录 使用 find() 方法按属性值在数组中查找对象使用 filter() 方法按属性值查找数组中的对象使用 JavaScript for 循环按属性值查找数组中的对象使用 JavaScript for...in 循环按属性值查找数组中的对象 数组指的是值的有序列表&#xff0c;每个值称为由索引指定的元素。 …

这所西安的985专硕爆冷,保护一志愿,过线即上岸!

本期为大家整理热门院校“西北工业大学”的择校分析&#xff0c;这个择校分析专题会为大家结合&#xff1a;初试复试占比、复试录取规则&#xff08;是否公平&#xff09;、往年录取录取名单、招生人数、分数线、专业课难度等进行分析。希望能够帮到大家! –所有数据来源于研招…

Plot、Scatter、Subplot函数用法

目 录 一、Plot()函数 二、Scatter()函数 三、Subplot()函数 一、Plot()函数 格式&#xff1a;matplotlib.pyplot.plot(x,y,format_string.**kwargs) 说明&#xff1a; x:x轴数据&#xff0c;列表或数组&#xff0c;可选(注&#xff1a;当绘制多条曲线时&#xff0c;不能省…

IT 系统巡检必须关注的指标总结

1. 系统整体架构 以下内容作为基本 IT 系统信息被首先调查记录&#xff0c;供分析参考使用。 ● 网络设备配置 ---设备型号, IOS 版本, 模块型号和数量,用途 ● 存储系统配置 ---设备型号, IO 带宽, Cache 容量&#xff0c;磁盘数量&#xff0c;接入模式&#xff0c;存储容…

Go项目配置管理工具---Viper

目录 Viper概述前言功能viper配置优先级 从Viper中获取值读取配置文件注册和使用别名 把值写入Viper设置默认值使用Set方法设置值把配置信息写入配置文件从io.Reader中读取配置信息到viper 监控Viper文件 Viper概述 前言 对于现代应用程序&#xff0c;尤其大中型的项目来说&a…

【MySQL】Mycat

文章目录 什么是Mycat为什么要用Mycatmycat能干什么各数据库中间件对比Mycat原理数据库中间件逻辑库逻辑表分片表分片规则全局表ER表非分片表分片节点节点主机mycat安装mycat核心配置schema.xmlserver.xmlrule.xml加密明文密码&#xff08;可选&#xff09; MyCat读写分离垂直拆…

OpenCV中的图像处理3.11(10) OpenCV中的图像变换

目录 3.11 OpenCV中的图像变换3.11.1 傅里叶变换目标理论Numpy中的傅里叶变换OpenCV中的傅立叶变换DFT的性能优化为什么Laplacian是一个高通滤波器&#xff1f;其他资源 翻译及二次校对&#xff1a;cvtutorials.com 编辑者&#xff1a;廿瓶鲸&#xff08;和鲸社区Siby团队成员&…

2.3 YARN伪分布式集群搭建

任务目的 重点掌握 YARN 集群的相关配置学会启动和关闭 YARN 集群的两种方式能够使用 jps 命令查看进程的启动情况能够通过 UI 查看 YARN 集群的运行状态任务清单 任务1:YARN 集群主要配置文件讲解任务2:YARN 集群测试任务步骤 任务1:YARN 集群主要配置文件讲解 1.1 配置环…

基于多尺度图神经网络的流场预测,实现精度与速度的平衡

项目简介 本项目来源于飞桨AI for Science共创计划的论文复现赛题&#xff0c;复现论文为《AMGNET: multi-scale graph neural networks for flow field prediction》。该论文主要采用图神经网络&#xff0c;因为在计算流体力学中计算域被网格离散化&#xff0c;这与图结构天然…

将PDF1页分割为4页

运行效果 原始PDF 分割后PDF 一、python代码&#xff08;用的是python3.9.0版本&#xff09; import os import tempfile from pdf2image import convert_from_path from PIL import Image from PyPDF2 import PdfReader, PdfWriterdef split_pdf_page(pdf_path, output_path…

4G开发板-安卓手机开发套件-MTK主板开发板定制

开发板是一种用于嵌入式系统开发的电路板&#xff0c;它包含了各种硬件组件&#xff0c;如中央处理器、存储器、输入设备、输出设备、数据通路/总线以及外部资源接口等。为了满足特定的开发需求&#xff0c;嵌入式系统开发者通常会根据项目要求来定制开发板&#xff0c;当然用户…

2023年前端面试高频考点ES6

目录 ES6新增 数据类型 基本数据类型 引用数据类型 Null&#xff0c;NaN&#xff0c;Undefined toString&#xff0c;valueOf &#xff0c;&#xff0c;Object.is() 判断数据类型&#xff1a;typeof运算符&#xff0c;instance of运算符&#xff0c;isPrototypeOf() 方…