【VUE3】保姆级基础讲解(一):初体验与指令

news2024/11/14 20:24:03

目录

安装和引入

CDN

本地引入

VUE初体验

MVVM模型

data属性 与 methods属性

 VUE基础-模板语法

Mustache双大括号语法

 v-once指令

v-html

v-pre

v-cloak

v-memo

v-bind(重要)

对象语法 

v-bind直接绑定对象

 v-on

条件渲染

v-for

基础使用

  数组更新监听

 key属性


 

安装和引入

CDN

<script src="https://unpkg.com/vue@next"></script>

本地引入

打开CDN链接,直接复制代码到本地js文件,再引入html

VUE初体验

  • 使用Vue.createApp函数创造一个app,在template里写html代码,最后用app.mount挂载到div中
<body>
    <div class="app"></div>
    
    <script src="https://unpkg.com/vue@next"></script>
    <script>
        const app = Vue.createApp({
            template:`<h2>asdasdas</h2><span>hehehe</span>`
        })
        //挂载  
        app.mount(".app")
    </script>
</body>
  • 动态展示,使用data创建函数,return创建的变量,在template中使用插值语法{{}}
<body>
    <div class="app"></div>
    
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            template:`<h2>{{title}}</h2><span>{{message}}</span>`,
            data:function(){
                return {
                    title:'hello word',
                    message:'message'                    
                }
            }
        })
        //挂载  
        app.mount(".app")
    </script>
</body>app")
  • 列表数据,使用v-for = “item in xxx”来遍历xx数组
<body>
    <div class="app"></div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            template:`
            <h2>{{title}}</h2>
            <ul>
                <li v-for="item in message">{{item}}</li>
            </ul>
            `,
            data:function(){
                return {
                    message:['message','123','222']              
                }
            }
        })
        app.mount(".app")
    </script>
</body>
  •  计数器,使用methods创建函数,并在template中使用 @click='plus'绑定事件与函数
<body>
    <div class="app"></div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            template:`
            <h2>计数器:{{counter}}</h2>
            <button @click='plus'>+1</button>
            <button @click='sub'>-1</button>
            `,
            data:function(){
                return {
                    counter:0
                }
            },
            methods:{
                plus:function(){this.counter++},
                sub:function(){this.counter==0? this.counter=0:this.counter--},
            }
        })
        app.mount(".app")
    </script>
</body>

 上面的例子中,template都写的很别扭,因为是在··中写的,没有提示,可以改进为:

<body>
    <div class="app">
        <h2>计数器:{{counter}}</h2>
        <button @click='plus'>+1</button>
        <button @click='sub'>-1</button>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data:function(){
                return {
                    counter:0
                }
            },
            methods:{
                plus:function(){this.counter++},
                sub:function(){this.counter==0? this.counter=0:this.counter--},
            }
        })
        app.mount(".app")
    </script>
</body>

既将template内容直接写到div中,app.mount(".app")时会自动渲染这个div的内容

MVVM模型

MVC和MVVM

什么是MVVM框架? - 知乎

 在VUE中,VUE就是充当了viewmodel角色,他是一个桥梁,链接了modelview,能自己完成事件监听和数据展示,不需要人为写代码设置

data属性 与 methods属性

 

 methods中都是使用this.去调用变量,这里的this都是一个proxy对象,用于监听变量的改变,这里不能用箭头函数的原因也是这个,因为箭头函数没有this,当我们使用this时实际上是使用了window,这样就不能找到我们需要改变的变量了

 VUE基础-模板语法

Mustache双大括号语法

上一章说了 {{}} 可以引入data函数中返回的变量,其实不仅仅是引入,甚至可以进行转换和计算

<body>
    <div class="app">
        <h2>{{counter*2}}</h2>
        <span>{{infos.split(' ')}}</span>
        <h3>{{age>=18?'成年人':"未成年人"}}</h3>
        <h2>{{gettime()}}</h2>

    </div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data:function(){
                return {
                    counter:100,
                    infos:'hello world',
                    age:22
                }
            },
            methods:{
                gettime:function(){
                    return '2022-12-1'
                }
            }
        })
        app.mount(".app")
    </script>
</body>

可以在{{}}中进行计算和字符串变换,也就是说{{}}可以写表达式

上述例子中,在{{}}中完成了

  • 数字计算表达式
  • 字符串分割转换
  • 三元表达式(这个地方不能写if表达式)
  • 函数调用

 v-once指令

 对于<h2>{{counter}}</h2>这个指令,如果在h2处增加v-once,变为:

<h2 v-once>{{counter}}</h2>

这个v-once的意思是是只渲染一次,那么后期如果counter这个值改变了,那么h2显示的内容也不变

v-html

可以解析html命令字符串

    <div class="app">
//解析字符串
        <h2 v-html="infos"></h2>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data:function(){
                return {
                    infos:`<span style="color: red;">hhhhh</span>`,
                }
            },

v-pre

可以跳过解析过程,也就是说{{}} 直接当成大括号字符串处理

<h2 v-pre>{{counter}}</h2>

结果就直接是{{counter}}

v-cloak

    <style>
        [v-cloak]{
            display: none;
        }
    </style>
</head>
<body>
    <div class="app">
        <h2 v-cloak>{{counter}}</h2> 
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data:function(){
                return {
                    counter:11,
                }
            },
        })
        setTimeout(()=>{
            app.mount(".app")
        },1000)
    </script>
</body>
</html>

如果我给 app.mount(".app")设置间隔时间,1s之后再挂载div,也就是说1s之后h2中的counter才会变渲染变为11

正常情况下,前1s,浏览器显示的是 {{counter}} 1s之后显示 11

很显然这样是不好的,因为我们不希望用户看见代码内容,那么就可以使用v-cloak ,在没有渲染完毕时先隐藏这个内容,注意这里还需要在style中设置其作用

v-memo

缓存一个模板的子树。在元素和组件上都可以使用。为了实现缓存,该指令需要传入一个固定长度的依赖值数组进行比较。如果数组里的每个值都与最后一次的渲染相同,那么整个子树的更新将被跳过

<body>
    <div class="app">
        <div v-memo="[name]">
            <h2>{{name}}</h2>
            <h2>{{age}}</h2>
            <h2>{{gender}}</h2>
        </div>
        <button @click="update"></button>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data:function(){
                return {
                    name:'kobe',
                    age:18,
                    gender:'male'
                }
            },
            methods:{
                update:function(){
                    this.gender='why'
                }
            }
        })
        app.mount(".app")
    </script>

 只有当我name变量发生更新时,别的变量才会更新,反之异然

也就是说上面的例子,点击按钮,gender不能更新

v-bind(重要)

动态的绑定一个或多个 attribute,也可以是组件的 prop。

之前说的方法都是对 标签的内容 起作用,这个可以对 标签属性 进行赋值等操作 

    <div class="app">
        <a v-bind:href="baidu">baidu</a>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data:function(){
                return {
                    baidu:'https://www.baidu.com'
                }

 省略写法

 <a :href="baidu">baidu</a>

对象语法 

例子:点击按钮改变颜色

    <style>
        .btnred{
            color: red;
        }
    </style>
</head>
<body>
    <div class="app">
        <button @click="update" :class="{btnred:isred}">btnnn</button>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data:function(){
                return {
                    isred:true
                }
            },
            methods:{
                update:function(){
                    this.isred = !this.isred
                }
            }
        })

 :class="{btnred:isred}"指的是,如果isred==true,则class =‘ btnred’,如果isred==false,则class = ‘’

这个地方按钮绑定函数,直接改变isred的值

相似的,如果要改变style内部的属性

    <div class="app">
        <button :style="{color: fontcolor}">btnnn</button>
    </div>
            data:function(){
                return {
                    fontcolor :'red'
                }
            },

这个地方属性的名字,如果是类似于background-color这种属性,则需要使用 驼峰命名法 或者 加引号 

v-bind直接绑定对象

<body>
    <div class="app">
        <button v-bind = obj>btnnn</button>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data:function(){
                return {
                    obj:{name:'kobe',age:15,gender:'male'}
                }
            },
        })
        app.mount(".app")
    </script>
</body>

可以直接用v-bind= obj  遍历obj里面的值键对  ,然后赋值给属性 

 v-on

对事件的绑定

<!-- 方法处理函数 -->
<button v-on:click="doThis"></button>

<!-- 动态事件 即事件是变化的-->
<button v-on:[event]="doThis"></button>

<!-- 内联声明 传递参数-->
<button v-on:click="doThat('hello', $event)"></button>
<!-- $event 是固定写法,表示动作的发起者 -->

<!-- 缩写 -->
<button @click="doThis"></button>

<!-- 使用缩写的动态事件 -->
<button @[event]="doThis"></button>

 v-on修饰符

.stop  阻止冒泡,相当于在函数中写  event.stopPropagation() 

<!-- 停止传播 -->
<button @click.stop="doThis"></button>

条件渲染

当 name 里面有值时渲染 ul li   当没有值的时候渲染 h2

直接在 v-if = '判断语句'  在后面还可以使用  v-else    v-else-if='判断语句'

<body>
    <div class="app">
        <ul v-if="name.length>0">
            <li v-for = 'item in name'>{{item}}</li>
        </ul>
        <h2 v-else>无数据</h2>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data:function(){
                return {
                    name:[1,2,3]
                }
            },
        })
        app.mount(".app")
    </script>
</body>

也就是说  v-if 如果为 false,那么这个内容将会直接被销毁 

 v-if 可以作为隐藏或者显示组件的依据,例如下面可以通过isshow变量控制div的隐藏

        <div v-if="isshow">
            <img src='https://game.gtimg.cn/images/yxzj/web201706/images/comm/floatwindow/wzry_qrcode.jpg'alt="">
        </div>

这里也可以使用 v-show   效果是一样的

        <div v-show="isshow">
            <img src='https://game.gtimg.cn/images/yxzj/web201706/images/comm/floatwindow/wzry_qrcode.jpg'alt="">
        </div>

 v-show  v-if  区别

v-for

基础使用

使用 “item in xxx”的格式遍历xxx,以获取内容item

<body>
    <div class="app">
        <ul>
            <li v-for="item in name">{{item}}</li>
        </ul>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data:function(){
                return {
                    name:[111,222,333,444]
                }
            },
        })
        app.mount(".app")
    </script>
</body>

 当然不仅仅是内容,也可以获取索引,注意是内容在前,索引在后

 <li v-for="(item,index) in name">{{index}}:{{item}}</li>

 当然对于  对象,也可以采用这种方法 

<body>
    <div class="app">
        <ul>
            <li v-for="(item,key) in products">{{key}}:{{item}}</li>
        </ul>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data:function(){
                return {
                    products:{name:'aaa',price:999}
                }
            },
        })
        app.mount(".app")
    </script>
</body>

 

  数组更新监听

<body>
    <div class="app">
        <ul>
            <li v-for="(item,index) in products">{{index}}:{{item}}</li>
        </ul>
        <button @click = 'deleteItem'>deleteItem</button>
    </div>
    <script src="./lib/vue.js"></script>
    <script>

        const app = Vue.createApp({
            data:function(){
                return {
                    products:[111,222,333,444,555,666]
                }
            },
            methods:{
                deleteItem:function(){
                    this.products.pop()
                }
            }
        })
        app.mount(".app")
    </script>
</body>

 点击按钮时,可以监听到数组的变化,并实时反馈到页面上

 key属性

VNode 

 也就是说,我们之前使用  <div class="app">hh</div>  创建的其实不是真实的DOM,而是VNode,之后再转换为真实的DOM

虚拟DOM

如果不是一个简单的div,而是一堆的元素,会形成一个VNode Tree,也就是虚拟DOM

为了理解 key属性的作用,这里看一个案例

<body>
    <div class="app">
        <ul>
            <li v-for="item in products" :key="'item">{{item}}</li>
        </ul>
        <button @click = 'insert'>insert</button>
    </div>
    <script src="./lib/vue.js"></script>
    <script>

        const app = Vue.createApp({
            data:function(){
                return {
                    products:['a','b','c','d','e']
                }
            },
            methods:{
                insert:function(){
                    this.products.splice(2,0,'f')
                }
            }
        })
        app.mount(".app")
    </script>
</body>

这里遍历 数组,产生li ,按钮可以在  c 和 d中间插入一个f

在没有key属性时 

a和b节点会只能复制,然后将c改为f,d改为c,最后增加一个节点放d

有key属性时

直接复用之前的c 和d,新增f插入 

实际上有key属性时,所有操作都会遵循 “能复用就复用”的原则,大大增加了效率

内置指令 | Vue.js

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

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

相关文章

antd级联选择器(a-cascader)动态加载和动态回显效果实现

文章目录1、介绍2、效果图如下图所示&#xff1a;&#xff08;只实现3层的&#xff09;3、实现方法&#xff08;1&#xff09;层级可单独选择&#xff08;2&#xff09;组件使用&#xff08;3&#xff09;data数据&#xff08;4&#xff09;实现动态加载数据1、 提示&#xff1…

模糊预测|RFIS与ANFIS模糊模型预测的比较(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

vue2中实现右键菜单

vue2中实现右键菜单 效果图-右键菜单 1、安装 npm install vue-contextmenujsyarn add vue-contextmenujsCDN <script src"https://unpkg.com/vue-contextmenujs/dist/contextmenu.umd.js">2、使用 2.1、引入 src/main.js import Contextmenu from "…

python sklearn knn快速实现,保姆级教学

目录介绍KNN实战加载模块读取数据训练、测试数据分割关键环节&#xff1a;训练预测sklearn官方代码实例介绍 首先上链接 https://www.sklearncn.cn/ scikit-learn是基于Python语言的机器学习库&#xff0c;具有&#xff1a; 简单高效的数据分析工具 可在多种环境中重复使用 …

一套Altair Feko复杂结构模型散射和天线辐射仿真建模攻略

导读&#xff1a;Feko软件广泛应用于电磁散射、电磁辐射仿真&#xff0c;例如&#xff1a;天线、天线布局、天线罩、屏蔽效能、电磁散射、频选结构、线束EMC等方面。问题种类繁多&#xff0c;但是无论仿真哪一类问题&#xff0c;其仿真流程是相同的&#xff0c;我们只需掌握了这…

VirtualBox Ubuntu 16.04 磁盘不相邻分区扩容解决方案

前言 博主做期末大作业时用到 VirtualBox 6.1 安装的 Ubuntu 16.04 LTS 虚拟机&#xff0c;开始只分配了 20GB 硬盘&#xff0c;跑实验时发现空间不够&#xff0c;需要对磁盘扩容&#xff0c;折腾了半天&#xff0c;在此做一个小记录。 警告&#xff1a;博主并不精通 Linux&am…

风险评估具体操作流程

概述 风险评估应贯穿于评估对象生命周期 各阶段中。评估对象生命周期各阶段中涉及的风险评估原则和方法昆一致的&#xff0c;但由干各阶段实施内容对象、安全需求不同.使得风险评估的对象、目的、要求等各方面也有所不同。在规划设计阶段&#xff0c;通过风险评估以确定评估对…

摄影师接单小程序开发,自由交易平台

在网红直播经济的强势发展下&#xff0c;年轻一代对于摄影方面的需求急速增长&#xff0c;但是年轻人群体在摄影方面的要求更趋向于个性化&#xff0c;普通的影楼不仅拍摄价格高&#xff0c;在拍摄风格上也比较单调&#xff0c;缺乏创新&#xff0c;难以满足用户消费需求。对于…

cubeIDE开发, stm32的ADC(模数转换器) 开发要点

一、ADC模数转换简介 ADC(Analog-to-Digital Converter&#xff0c;模数转换器) 是将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号&#xff0c;例如温度、压力、声音或者图像等&#xff0c;需要转换成更容易储存、处理和发射的数字形式。模数转换器可以实…

cesium切片底图正常出来但控制台一直报错的方法

1、部署ngnix服务 2、修改ngnix配置 在location 下的路径配置如下内容 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET, POST, OPTIONS; add_header Access-Control-Allow-Headers DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Re…

程序员需知的8个视频教程网站,建议收藏

上一篇介绍的是在线教程网站以文字性内容为主&#xff0c;同样收藏了一些以视频为主的一些网站&#xff0c;相比较而言&#xff0c;更容易上手&#xff0c;当然&#xff0c;也更加耗时间。 1、B站 简 介&#xff1a;没错&#xff0c;bilibili也可以用来学习&#xff0c;除了番…

吉林优美姿文化:抖音小店店铺评分怎么提升?

现在大家都在抖音平台上购物&#xff0c;只用等商家发货就行了&#xff0c;但是抖音发货也是有一定相关规定的&#xff0c;也需要各位商家去遵守的&#xff0c;那么抖音的发货时效方面有着什么样的规定呢&#xff1f;跟着吉林优美姿小编来看一下吧&#xff01;发货时间&#xf…

TPE-3-CHO;CAS:2351847-81-7;AIE聚集诱导发光

中文名 4,4,4,4-(乙烯-1,1,2,2-四基)四(([1,1-联苯]-3-甲醛)) 英文名 4,4,4,4-(Ethene-1,1,2,2-tetrayl)tetrakis(([1,1-biphenyl]-3-carbaldehyde)) 中文别名 四(3-甲醛基联苯基)乙烯 | 4,4,4,4-(乙烯-1,1,2,2-四基)四(([[1,1-联苯] -3 -甲醛)) 物理化学性质 密度 1.2200.06 g…

spring的BeanPostProcessor分析

spring常见的set注入&#xff0c;就是通过配置文件给变量赋值&#xff0c;这属于第一步注入。BeanPostProcessor还能进行第二次注入&#xff0c;简单来说就是第二是给变量赋值 1、首先定义一个实体类EntityObject&#xff0c;声明get和set方法 package beanPost;public class…

C语言---函数---总结

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;鹏哥带我学c带我飞 &#x1f4ac;总结&#xff1a;希望你看…

一文了解Linux内核网络设备驱动

1. 接收数据包过程概述 介绍数据包收包过程&#xff0c;有助于我们了解Linux内核网络设备在数据收包过程中的位置&#xff0c;下面从宏观的角度介绍数据包从被网卡接收到进入 socket 接收队列的整个过程&#xff1a; 加载网卡驱动&#xff0c;初始化数据包从外部网络进入网卡…

月子会所管理系统| 月子会所小程序| 数字化门店转型

随着二孩三孩政策的相继开放&#xff0c;中国母婴市场呈现出稳定增长的局面&#xff0c;据相关数据显示&#xff0c;2019年中国母婴市场规模达34950亿元&#xff0c;预计2024年将增长到70000亿元。母婴行业的细分类高&#xff0c;同时还可与多行业进行对接。 母婴月子会所近些年…

Vue3 事件处理

Vue3 事件处理1.基本使用2.事件修饰符3.按键修饰符1.基本使用 我们可以使用 v-on 指令来监听 DOM 事件&#xff0c;从而执行 JavaScript 代码。 v-on 指令可以缩写为 符号。 语法格式&#xff1a; v-on:click"methodName" 或 click"methodName"一个最…

基于jsp+ssm的驾校预约管理系统-计算机毕业设计

项目介绍 驾校预约管理系统是一个高校用来管理教员和学员的授课信息并存储档案必需的一个管理系统&#xff0c;由于时代的进步&#xff0c;它成为了一个现代化管理不可缺少的一部分。它的查询的方便简洁&#xff0c;可以为一个驾校经营者节约足够的时间&#xff0c;为驾校迅速…

QWebEngine集成Netron可视化模型

Netron是一个用于可视化深度学习网络模型的工具软件&#xff0c;主体以JavaScript语言实现&#xff0c;源码在: https://github.com/lutzroeder/netron 。用户可以使用各系统平台的安装包进行安装之后使用&#xff0c;也可以用浏览器使用在线版本: Netron。 Netron支持几乎所有…