2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法

news2024/10/6 14:33:26

文本渲染指令

文本渲染指令-v-html与v-text

Vue使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是

合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析。

在前面,我们一直使用的是字符串插值的形式渲染文本,但是除此方法之外,vue还提供了其他几种常见的文本渲

染方式:

  1. v-text:更新元素的innerText

  2. v-html:更新元素的innerHTML

    <div id="app">
        <p v-html="msg"></p>
        <p v-text="msg"></p>
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data(){
                return {
                    msg: '<h1>hello</h1>'
                }
            },
        }).mount('#app');
    </script>

在Vue中,我们可以使用{{}}将数据插入到相应的模板中,这种方法是一种文本插值。

使用这种方法,如果网络慢或者JavaScript出错的话,会将{{}}直接渲染到页面中。值得庆幸的是,Vue还提供了v-text和v-html来渲染文本或元素。这样就避免了将{{}}直接渲染到页面中。

属性绑定指令

如果想让html标签中的属性,也能应用Vue中的数据,那么就可以使用vue中常用的属性绑定指令:v-bind

v-bind 指令可以简写为::

    <div id="app">
        <p v-bind:title="msg">hello</p>
        <!-- v-bind的简写形式 --> 
        <p :title="msg">hello</p>
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data(){
                return {
                    msg: 'hello world!'
                }
            },
        }).mount('#app');
    </script>

上面展示的是v-bind的最基本的使用,第一种是完整语法,第二种是缩写方式。

除了将元素的title属性和vue实例的相关字段进行绑定外,还能将其他的属性字段进行绑定,最常见的是对于样式

的绑定,即class和style属性。

绑定样式

使用v-bind指令绑定class属性,就可以动态绑定元素样式了。

    <div id="app">
        <p :class="className">DOM元素的样式绑定</p>
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data(){
                return {
                    className: 'one' 
                }
            },
        }).mount('#app');
    </script>
    <style>
        .one{
            color: red;
        }
        .two{
            font-size: 48px;
        }
    </style>

使用对象语法绑定样式

我们可以给v-bind:class 一个对象,也可以直接绑定数据里的一个对象,以动态地切换class。

    <div id="app">
        <p :class="{one:isOne,two:isTwo}">DOM元素的样式绑定</p>
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
        el:'#app',
            data(){
                return {
                    isOne: true,
                    isTwo: true
                }
            },
        }).mount('#app');
    </script>
    <style>
        .one{
            color: red;
        }
        .two{
            font-size: 48px;
        }
    </style>

使用三目运算绑定样式

    <div id="app">
        <p :class="userId==1?classNameone:classNametwo">hello world!</p>
    </div>
 
    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data(){
                return {
                    userId:1,
                    classNameone: 'one',
                    classNametwo: 'two',
                }
            },
        }).mount('#app');
    </script>
    <style>
        .one{
            color: red;
        }
        .two{
            font-size: 48px;
        }
    </style>

直接绑定内联样式

    <div id="app">
        <p :style="{color:colorValue,fontSize:fontSizeValue}">hello world!</p>
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data(){
                return {
                    colorValue: 'orange',
                    fontSizeValue: '50px'
                }
            },
        }).mount('#app');
    </script>

注意:绑定style属性后,样式的书写要遵循javaScript规范。

同时要使用对象的形式加上{}

也就是将 xxx-xxx 改写成驼峰命名方式 xxxXxxx


事件处理指令

事件绑定

我们可以用 v-on 指令绑定一个事件监听器,通过它调用我们 Vue 实例中定义的方法。

v-on指令可以简写为:@

 <div id="app">
         <!-- pointme就是点击事件的处理函数 --> 
        <button v-on:click="pointme">点击</button>
        <!-- v-on指令的简写 -->
        <button @click="pointme">点击</button>
        <!-- 焦点失去事件 -->
        <input type="text" @blur="blurEvent">
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data(){
                return {
                    
                }
            },
            //methods:此处声明Vue方法 
            methods:{
                pointme(){
                //在控制台输出hello 
                    console.log('hello');
                },
                blurEvent(){
                    console.log('焦点失去了');
                }
            }
        }).mount('#app');
    </script>

事件处理指令-事件处理的参数

事件处理时还可以传递参数。比如下面的案例:对一个数进行加减运算

    <div id="app">
        {{num}}
        <!-- 第一种写法 -->
        <button v-on:click="add">加</button>
        <button @click="subtract">减</button>
        <!-- 第二种优化写法 ()中的参数代表每次+2或-2-->
        <button v-on:click="change(2)">加</button>
        <button @click="change(-2)">减</button>
        <!-- 第三种写法 ()中传多个参数使用,分开-->
        <button v-on:click="change1(2, 10)">加</button>
        <button @click="change1(-2, 10)">减</button>
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data(){
                return {
                    num: 0
                }
            },
            methods:{
            //第一种写法的事件处理逻辑 
                add(){
                    this.num++;
                },
                subtract(){
                    this.num--;
                },
            //第二种优化写法的事件处理逻辑 
                change(value){
                    this.num += value;
                },
            //第三种写法的事件处理逻辑 
                change1(value, param){
                    this.num += value;
                }
            }
        }).mount('#app');
    </script>

样式切换实例

<div id="app">
    <p :class="className" @click="change">hello world!</p>
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data(){
            return {
                className: 'one'
            }
        },
        methods:{
            change(){
                this.className = this.className=='one'?'two':'one';
            }
        }
    }).mount('#app');
</script>
<style>
    .one{
        color: red;
    }
    .two{
        color: blue;
    }
</style>

事件对象

我们在学习JavaScript时知道,事件处理时会有一个事件对象。事件对象代表事件的状态,比如事件在其中发生的

元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

在Vue的事件处理中,也可以使用 $event 的形式给事件处理函数传递事件对象。

 <div id="app">
        {{num}}
        <button v-on:click="change(3,$event)">加</button>
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data(){
                return {
                    num: 0
                }
            },
            methods:{
                change(value,event){
                    this.num += value;
                    console.log(event);
                    console.log(event.target);
                }
            }
        }).mount('#app');
    </script>

注意:如果只传递事件对象这一个参数时, 也可以这样简写 v-on:click="add" , 也就是不加小括号时,默认 传递一个事件对象参数。


事件修饰符

我们还知道,在JavaScript中可以使用 event.preventDefault() 或 event.stopPropagation() 等来阻止事件冒泡,或

者阻止浏览器默认行为。那么Vue也提供了这样的功能,叫做事件修饰符。

<div id="app">
    <div class="div1" @click="div1Event" @contextmenu.prevent>
        <div class="div2" @click.stop="div2Event"></div>
    </div>
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data(){
            return {
                num: 0
            }
        },
        methods:{
            div1Event(){
                console.log('div1点击事件');
            },
            div2Event(){
                console.log('div2点击事件');
            }
        }
    }).mount('#app');
</script>
<style>
    .div1{
        width: 200px;
        height: 200px;
        background-color: red;
    }
    .div2{
        width: 100px;
        height: 100px;
        background-color: blue;
    }
</style>

条件渲染指令

条件渲染指令,可以根据条件判断,来设置元素的显示与隐藏。

v-if指令与v-show指令

当v-if的值为false时,网页中将不会对此元素进行渲染

<div id="app">
    <div v-if="isShow">这里使用v-if</div>
    <div v-show="num==1">这里使用v-show</div>
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data(){
            return {
                isShow:true,
                num: 2
            }
        },
    }).mount('#app');
</script>

v-else指令和v-else-if指令

我们可以使用 v-else 指令来表示 v-if 的“else 块”,v-else 元素必须紧跟在 v-if 或者 v-else-if 元素的后面——否则它

将不会被识别。而v-else-if则是充当 v-if 的“else-if 块”,可以链式地使用多次。

    <div id="app">
        <p v-for="(value,key,index) in user">{{index}}:{{key}}:{{value}}</p>
    </div>

    <script src="../js/vue3.js"></script>
    <script>
        Vue.createApp({
            data(){
                return {
                    user: {
                        userId:1,
                        userName: '张三',
                        userSex: '男'
                    }
                }
            },
        }).mount('#app');
    </script>

v-if指令和v-show指令

<div id="app">
    <div v-if="isShow">这里使用v-if</div>
    <div v-show="num==1">这里使用v-show</div>
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data(){
            return {
                isShow:true,
                num: 2
            }
        },
    }).mount('#app');
</script>

通过上面的例子,我们不难发现两者的不同:

  1. v-if是真正的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。

  2. v-if是惰性的,只有当条件为true时才会渲染,如果条件为false则什么都不做

  3. v-if有很高的切换开销,适用于条件不太容易改变的时候

  4. v-show不管条件是true还是false都会进行渲染。并且只是简单地基于 CSS 进行切换

  5. v-show有很高的初始渲染开销,适用于非常频繁地切换

循环遍历指令

vue.js 的循环渲染是依赖于 v-for 指令,它能够根据 vue 的实例里面的信息,循环遍历所需数据,然后渲染出相应

的内容。它可以遍历数组类型以及对象类型的数据,js 里面的数组本身实质上也是对象,这里遍历数组和对象的时

候,方式相似但又稍有不同。

遍历对象属性

value 是遍历得到的属性值,key 是遍历得到的属性名,index 是遍历次序,这里的 key、index 都是可选参数,如

果不需要,这个指令其实可以写成 v-for="value in user";

<div id="app">
    <p v-for="(value,key,index) in user">{{index}}:{{key}}:{{value}}</p>
        <!-- 简单写法 -->
    <p>{{user.userId}}</p>
    <p>{{user.userName}}</p>
    <p>{{user.userSex}}</p>
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data(){
            return {
                user: {
                    userId:1,
                    userName: '张三',
                    userSex: '男'
                }
            }
        },
    }).mount('#app');
</script>

遍历数组元素

value 是遍历得到的元素,index 是数组下标,这里的index 也是可选参数,如果不需要,这个指令其实可以写成

v-for="value in userArr";

<div id="app">
    <!-- <p v-for="user in userArr">{{user.userId}},{{user.userName}},{{user.userSex}}</p> -->
    <ul>
        <li v-for="(user,index) in userArr" :key="user.userId">
            {{index}},{{user.userId}},{{user.userName}},{{user.userSex}}
        </li>
    </ul>
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                user: {
                    userId: 1,
                    userName: '张三',
                    userSex: '男'
                },
                userArr: [
                    {
                        userId: 1,
                        userName: '张三',
                        userSex: '男'
                    },{
                        userId: 2,
                        userName: '李四',
                        userSex: '男'
                    },{
                        userId: 3,
                        userName: '王五',
                        userSex: '女'
                    }
                ]
            }
        },
    }).mount('#app');
</script>

关于循环中的key

上面实例中存在一个问题:当更改数组中某一个元素时,Vue会对整个数组进行重新渲染。在实际开发中,这样的

代码是不被允许的,在数据量很多的时候,它会严重降低页面的性能。

这时,你可以加唯一性key值,增加后vue就会辨认出哪些内容被渲染后并没有变化,而只渲染新变化的内容。

<!-- 这里使用userId这样一个唯一标识来作为key值 --> 
<p v-for="(item,index) in userArr" :key="item.userId"> 
    {{item.userId}},{{item.userName}},{{item.userSex}} 
    <button @click="operate(index)">操作</button> 
</p> 

综合案例

<div id="app">
    <table>
        <tr>
            <th>编号</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>操作</th>
        </tr>
        <tr v-for="(user,index) in userArr" :key="user.userId">
            <td>{{user.userId}}</td>
            <td>{{user.userName}}</td>
            <td>{{user.userAge}}</td>
            <td><button @click="del(index)">删除</button></td>
        </tr>
        <tr>
            <td colspan="4"><button @click="clear">清空</button></td>
        </tr>
    </table>
    <h3>添加</h3>
    姓名<input type="text" v-model="userName"><br>
    年龄<input type="text" v-model="userAge"><br>
    <button @click="add">添加</button>
</div>

<script src="../js/vue3.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                userArr: [
                    {
                        userId: 1,
                        userName: '张三',
                        userAge: 22
                    }, {
                        userId: 2,
                        userName: '李四',
                        userAge: 23
                    }, {
                        userId: 3,
                        userName: '王五',
                        userAge: 24
                    }
                ],
                userName: '',
                userAge: 0
            }
        },
        methods:{
            add(){
                let userId = 0;
                if(this.userArr.length == 0){
                    userId = 1;
                }else{
                    userId = this.userArr[this.userArr.length-1].userId+1;
                }
                let user = {
                    userId: userId,
                    userName: this.userName,
                    userAge: this.userAge
                }
                this.userArr.push(user);
            },
            del(index){
                this.userArr.splice(index,1);
            },
            clear(){
                this.userArr.splice(0,this.userArr.length);
            }
        }
    }).mount('#app');
</script>
<style>
    #app {
        width: 500px;.
    }

    table {
        width: 100%;
        border-collapse: collapse;
    }

    table tr th,
    table tr td {
        height: 35px;
        border-bottom: solid 1px #999;
        text-align: center;
    }
</style>

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

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

相关文章

利用STM32实现语音识别功能

引言 随着物联网和智能设备的普及&#xff0c;语音识别技术正逐渐成为用户交互的主流方式之一。 STM32微控制器具备处理高效率语音识别算法的能力&#xff0c;使其成为实现低成本、低功耗语音交互系统的理想选择。 本教程将介绍如何在STM32平台上开发和部署一个基础的语音识…

创建codereview

创建codereview流程 一、开始创建二、选择分支三、添加细节 一、开始创建 点击codereivew按钮 为新的codereview选择一个工程后点击create review 二、选择分支 选择目标分支和要比对的分支&#xff0c;比如develop 三、添加细节 Add branch后&#xff0c;可以继续Edit …

Linux深入学习内核 - 中断与异常(下)

软中断&#xff0c;Tasklet和Work Queue 由内核执行的几个任务之间有一些不是紧急的&#xff0c;他们可以被延缓一段时间&#xff01;把可延迟的中断从中断处理程序中抽出来&#xff0c;有利于使得内核保持较短的响应时间&#xff0c;所以我们现在使用以下面的这些结构&#x…

JVM的垃圾回收机制(GC机制)

在Java代码运行的过程中&#xff0c;JVM发现 某些资源不需要再使用的时候&#xff0c;就会自动把资源所占的内存给回收掉&#xff0c;就不需要程序员自行操作了。“自动回收资源”就是JVM的“垃圾回收机制”&#xff0c;“垃圾回收机制”也称"GC机制"。 对于Java代码…

文心一言 VS 讯飞星火 VS chatgpt (250)-- 算法导论18.2 3题

三、请说明如何在一棵 B 树中找出最小关键字&#xff0c;以及如何找出某一给定关键字的前驱。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在B树&#xff08;也称为B-tree&#xff09;中&#xff0c;最小的关键字总是位于最左边的叶子节点的最左边的元素。要…

C++ | 类和对象(中) (构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载 | 取地址 | const取地址)

目录 默认成员函数 构造函数 构造函数是什么 构造函数特征 什么是默认构造函数 注意事项 编译器自动生成的默认构造 缺省值 对象如何传值给构造函数 初始化列表 析构函数 析构函数的特征 编译器默认生成的析构函数 总结 拷贝构造函数 拷贝构造函数的使用场景 拷…

MySQL数据库练习(13)

schooldb库——utf8字符集——utf8_general_ci排序规则 61. DDL CREATE TABLE settlements (settlementId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,settlementNo varchar(20) NOT NULL COMMENT 结算单号,settlementType tinyint(4) NOT NULL DEFAULT 0 COMMENT 结算…

金融案例:统一查询方案助力数据治理与分析应用更高效、更安全

随着企业数据规模的增长和业务多元化发展&#xff0c;海量数据实时、多维地灵活查询变成业务常见诉求。同时多套数据库系统成为常态&#xff0c;这既带来了数据管理的复杂性&#xff0c;又加大了数据使用的难度&#xff0c;面对日益复杂的数据环境和严格的数据安全要求&#xf…

Centos7 安装Git、使用

Centos7 安装Git 一、安装步骤1.1 查看版本1.2 卸载1.3 安装 二、创建仓库2.1 新增仓库2.2 新增配置项 三、管理文件3.1 文件创建3.2 文件修改、add、commit3.3 tree结构探索 四、分支4.1 创建分支&#xff1a;4.2 查看分支4.3 切换分支4.4 删除分支4.5 合并冲突 一、安装步骤 …

【蓝桥杯嵌入式】第七届省赛 - 模拟液位检测告警系统

代码开源&#xff0c;Gitee自取 代码开源&#xff0c;Gitee自取 代码开源&#xff0c;Gitee自取 目录 0 前言 1 展示 1.1 源码 1.2 演示视频 1.3 题目展示 2 工程配置 3 资源配置&代码实现 3.1 定时器 3.2 液位检测 3.3 液位阈值设定 3.4 液位阈值设定 3.5 串…

使用unreal engine5.3.2创建c++第一人称游戏

UE5系列文章目录 文章目录 UE5系列文章目录前言一、NuGet 简介二、解决方法&#xff1a; 前言 为了使用unreal engine5.3.2创建c第一人称游戏&#xff0c;今天安装了Visual Studio 2022专业版。在ue5中创建c工程&#xff0c;结果编译器报错&#xff1a; 严重性 代码 说明 项目…

UDP和TCP(传输层)

这里写目录标题 UDPUDP的基本特点UDP协议报文格式 TCPTCP协议报文格式TCP特点可靠传输实现机制确认应答超时重传数据丢了应答报文丢了 小结 UDP UDP的基本特点 无连接不可靠传输面向数据报全双工 UDP协议报文格式 2个字节有效范围(无符号): 0 ~ 65535(2^16 - 1). 2个字节有效范…

Web开发:<div>作用

< div >元素作用 解释用途1. 布局&#xff1a;2. 样式化&#xff1a;3. 结构化&#xff1a;4. JavaScript操作&#xff1a;5. 响应式设计&#xff1a;6. 模块化和重用&#xff1a;7. 包裹其他元素&#xff1a;8. 清除浮动&#xff1a; 总结举例示例结果分析 解释 在Web开…

全栈开发之路——前端篇(1)介绍、框架确定、ide设置与项目创建

文章目录 前言一、前端框架React和VueReactVue 二、编译器选择和配置1.传统的下载和使用2.你可能遇到的问题1.ERR&#xff01; syscall mkdir2.vue : File C:\nodejs\node_global\vue.ps1 cannot be loaded because running scripts is disabled on3.出现乱码问题 3.运行Vue 三…

模型智能体开发之metagpt-单智能体实践

需求分析 根据诉求完成函数代码的编写&#xff0c;并实现测试case&#xff0c;输出代码 代码实现 定义写代码的action action是动作的逻辑抽象&#xff0c;通过将预设的prompt传入llm&#xff0c;来获取输出&#xff0c;并对输出进行格式化 具体的实现如下 定义prompt模版 …

python算法题

需求 代码 class Solution:def searchInsert(self, nums: List[int], target: int) -> int:if max(nums) >target:for i in range(len(nums)-1):if nums[i1] > target and nums[i] <target:return i1if max(nums) <target:return len(nums)if min(nums) > …

解析transformer中的各模块结构

transformer是一种编解码&#xff08;encoder-decoer&#xff09;结构&#xff0c;用于自然语言处理、计算机视觉等领域&#xff0c;编解码结构是当前大模型必包含的部分。 文章目录 1. 词嵌入模块 2.位置编码模块 3. 多头注意力机制模块 3.1 自注意力机制模块 3.2 多头注…

Golang图片验证码的使用

一、背景 最近在使用到Golang进行原生开发&#xff0c;注册和登录页面都涉及到图片验证码的功能。找了下第三方库的一些实现&#xff0c;发现了这个库用得还是蛮多的。并且支持很多类型的验证方式&#xff0c;例如支持数字类型、字母类型、音频验证码、中文验证码等等。 项目地…

操作系统(2)——进程线程

目录 小程一言专栏链接: [link](http://t.csdnimg.cn/8MJA9)基础概念线程详解进程详解进程间通信调度常用调度算法 重要问题哲学家进餐问题问题的描述策略 读者-写者问题问题的描述两种情况策略 总结进程线程一句话 小程一言 本操作系统专栏&#xff0c;是小程在学操作系统的过…

Dockerfile实战(SSH、Systemctl、Nginx、Tomcat)

目录 一、构建SSH镜像 1.1 dockerfile文件内容 1.2 生成镜像 1.3 启动容器并修改root密码 二、构建Systemctl镜像 2.1 编辑dockerfile文件 ​编辑2.2 生成镜像 2.3 启动容器&#xff0c;并挂载宿主机目录挂载到容器中&#xff0c;然后进行初始化 2.4 进入容器验证 三、…