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

文本渲染指令

文本渲染指令-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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索科技园区的创新应用架构

在当今科技快速发展的时代&#xff0c;科技园区已经成为了创新和技术发展的孵化器和聚集地。在这样的环境中&#xff0c;科技园区的应用架构扮演着至关重要的角色&#xff0c;它不仅需要支持各种创新型企业和科技项目的发展&#xff0c;还需要提供高效的技术基础设施和服务。下…

python 11Pandas数据可视化实验

实验目的&#xff1a; 学会使用Pandas操作数据集&#xff0c;并进行可视化。 数据集描述&#xff1a; 该数据集是CNKI中与“中药毒理反应”相关的文献信息&#xff0c;包含文章题目、作者、来源&#xff08;出版社&#xff09;、摘要、发表时间等信息。 实验要求&#xff1…

ubuntu外置网卡配置AP模式

外置网卡RTL8811CU设置 UBUNTU使用RTL8811CU网卡&#xff08;包含树莓派&#xff09; 外置网卡配置AP模式流程 1. 检查网卡支持情况&#xff08;是否支持AP模式&#xff09; iw list找到以上部分&#xff0c;发现支持AP 2. 安装依赖 sudo apt-get update sudo apt-get in…

39 死锁

目录 1.死锁 2.线程同步 3.条件变量 4.案例 死锁 概念 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态 四个必要条件 互斥条件&#xff1a;一个资源每次只能被一个执行流使用 请求…

MFC 列表控件修改实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例&#xff08;源码下载&#xff09;》 2、程序功能选中列表控件某一项&#xff0c;修改这一项的按钮由禁止变为可用&#xff0c;双击这个按钮弹出对话框可对这一项的记录数据进行修改&#xff0c;点击确定保存修改数…

SpirngBoot整合快递100

目录 一、注册快递100 二、技术文档地址 三、需要认证的key和comcumer 四、spring boot 整合快递 100使用 4.1 引入快递100和hutool的依赖 4.2 将key和comcumer写入application.properties文件中 4.3 新建一个modle,用于将查出来的json数据转成对象 4.4 新建一个controll…

golang 基础知识细节回顾

之前学习golang的速度过于快&#xff0c;部分内容有点囫囵吞枣的感觉&#xff0c;写gorm过程中有很多违反我常识的地方&#xff0c;我通过复习去修正了我之前认知错误和遗漏的地方。 itoa itoa自增的作用在编辑error code时候作用很大&#xff0c;之前编辑springboot的error c…

python从0开始学习

目录 前言 1、print函数 2、input函数 3、保留字和标识符 总结 前言 本篇文章我们开辟一个新的学习模块&#xff1a;python。python是一个十分简洁实用的编程语言&#xff0c;我们将从0开始学习python 1、print函数 print(*args, sep , end\n, fileNone, flushFalse) pytho…

2024五一数学建模C题煤矿深部开采冲击地压危险预测原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024五一数学建模竞赛C题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024五一数学建模C题完整原创论文讲解&#xff0c;手把手保姆级教学&#xff01;_哔哩哔哩_bilibili 202…

[1678]旅游景点信息Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 旅游景点信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

在idea中连接mysql

IDE&#xff08;集成开发环境&#xff09;是一种软件应用程序&#xff0c;它为开发者提供编程语言的开发环境&#xff0c;通常集成了编码、编译、调试和运行程序的多种功能。一个好的IDE可以大幅提高开发效率&#xff0c;尤其是在进行大型项目开发时。IDE通常包括以下几个核心组…

酒水门店私域流量运营搭建执行规划方案

【干货资料持续更新&#xff0c;以防走丢】 酒水门店私域流量运营搭建执行规划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 精酿啤酒品牌私域执行运营的内容策划&#xff0c;涉及以下几个…

在做题中学习(48):朴素的二分查找

. - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a; 暴力求解 for循环中&#xff0c;从nums[0]枚举到nums[n-1]&#xff0c;依次判断&#xff0c;返回 target的值。 时间复杂度 : O(N) :因为要遍历一遍数组 解法二&#xff1a;二分查找 因为此数组为有序的…

利用Github发现优质的学习项目网址

1. 直接搜索&#xff0c;star的数量越多的项目质量越高 2.Github Trending 地址: https://github.com/trending 3. Gitstar Ranking 地址: https://gistar-ranking.com/ 4. Awesome Topic 地址: https://github.com/topics/awesome

FIFO Generate IP核使用——Data Counts页详解

在Vivado IDE中&#xff0c;当看到一个用于设置数据计数选项的选项卡时&#xff0c;需要注意的是&#xff0c;尽管某些选项值可能因为当前的配置而显示为灰色&#xff08;即不可选或已禁用&#xff09;&#xff0c;但IDE中显示的有效范围值实际上是你可以选择的真实值。即使某些…

静态库、动态库回顾

回顾一下库相关的知识点&#xff0c;总结备忘一下。在某种情况下&#xff0c;你有了如下的代码&#xff0c;结构如下 //pra.h #include <stdio.h> void test_01(); //pra.c #include "pra.h" void test_01() {printf("xxxxxxx----->%s %s()\n",…

莫比乌斯变换的数学原理

一、说明 关于莫比乌斯变换&#xff0c;是一个代数几何变换的重要概念。也是双曲几何的重要理论&#xff0c;比如庞加莱盘就是建立在这个理论上&#xff0c;那么这个变换到底有哪些内容&#xff1f;本文将做出详细的解读。 二、线性变换和逆变换 在本节中&#xff0c;我们研…

# notepad++ 编辑器英文版,如何打开自动换行

notepad 编辑器英文版&#xff0c;如何打开自动换行 在Notepad中&#xff0c;如果你想要开启自动换行功能&#xff0c;可以按照以下步骤操作&#xff1a; 1、打开 Notepad 编辑器。 1.1. 依次点击菜单栏中的【视图】&#xff0c;英文版对应【View】。1.2. 在【视图】下拉菜单…

css---浮动知识点精炼汇总

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 浮动简单理解与介绍 这是我们普通的页面标签效果。 每个标签从上到下依次排列。 浮动顾名思义就是让这个标签飞翔起来。 他飞起来后&#xff0c;后面的标签来到他的位置上。 而浮动的标签就会显示在标签的上面。…

【译】Celery文档1:First Steps with Celery——安装和配置Celery

https://docs.celeryq.dev/en/stable/getting-started/first-steps-with-celery.html#first-steps Celery的第一步 Celery时一个自带电池的任务队列。 本教程内容&#xff1a; 安装消息传输代理(broker)安装Celery并创建第一个任务(task)启动Celery工作进程(worker)并执行任务…