Vue基本使用

news2025/2/27 2:57:27

上代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <!-- 导入vue的脚本文件,不是固定的 -->
    <script src="unpkg.com_vue@3.3.4_dist_vue.global.js"></script>
</head>
<body>

    <!-- 声明要被vue控制的DOM区域 -->
    <div id="app">
        {{message}} //第一种渲染方式{{}}:模板语法,两个花括号,可以将data中的数据直接做渲染.模板中只能有变量或者表达式,不能有语句.

        <!-- 变量可以随意使用JS的方法 -->
        {{message.split(" ").reverse().join('')}}
        <p>姓名:{{user.username+'是我'}}</p>

        <p>性别:{{user.gender}}</p>
        <p>{{desc}}</p>//默认将标签看成字符串

        <br>//渲染到标签里的地址
        <p v-html="desc">{{desc}}</p>//v-html为指令,后面加上对应的值,作用为将指定的变量以HTML的形式渲染出来
        <br>//渲染到属性里的地址 :/ v-bind:   不这样设置标签属性会默认把后面的变量当成字符串常量,加上冒号属性就会将""中的内容作为变量去读<br>
        <a :href="link">百度</a>
        <input type="text" :placeholder="inputValue">
        <img :src="imgSrc" :style="{width:w}" alt="">


    </div>

    <div id="app0">

        <!-- 数据发生变化,页面会自动渲染刷新 -->
        <h3>count的值为: {{count}}</h3>
        <!-- 事件绑定指令 -->
        <button v-on:click="addCount">+1</button>
        <button @click="count+=1">+1</button> 
        <!-- 貌似之前on开头的都可以用@表示 -->


        <!-- 条件渲染指令:根据条件控制元素是否可以显示,比如豆瓣电影"新"标签是动态显示的-->
        <button @click="flag=!flag">Reverse Flag!</button>
        <!-- v-if:如果属性值为true,则渲染该标签 -->
        <p v-if="flag">请求成功 --- 被 v-if 控制</p>
        <p v-else>还没有成功捏</p>
        <!-- 注意v-else必须紧跟v-if之后! 可以加表达式比如  v-if="type==='A"实现真正的if判断语句-->

        <p v-show="flag">请求成功 --- 被 v-show 控制</p>
        <!-- 二者不同的地方在于,如果flag=false那么v-if所在的标签根本不会被创建,检查html源码的时候完全消失 -->
        <!-- 而v-show的标签会被创建,只不过通过增加CSS方式增加style="display:none;" -->
        如果该标签会经常切换显示/不显示,则建议使用v-show,只是增删属性效果,性能更高!不过v-if还有v-else!


    </div>

    <div id="app1">
        <!-- 列表渲染指令:后端返回多少数据,前端就渲染多少标签 -->
        <ul>
            <!-- 实际上写的只有一个li标签,但是能渲染很多 -->
            <li v-for="(user,i) in userList" :key="user.name">索引:{{i}},姓名:{{user.name}}</li>
            <!-- 也可以没有索引"user in userList"这样 -->
        </ul>

        <!-- v-for中的key,标记每一个li,给每一个使用v-for的li标签加上索引,否则组件化开发会报错 -->
        <input type="text" v-model="name">
        <!-- v-model双向绑定name的值,而且不用加 :以读取变量。如果页面发生变化则前端数据也会发生变化,数据变化则页面也会发生变化 -->
        <!-- 如果使用 :value="name",则为单向绑定,页面变化时原数据无法改变 -->
        <!-- 结合input,可以得出结论:用户输入的内容会自动影响name的属性值,会自动存储在前端data-return的name变量中了 -->
        <button @click="addNewUser">添加</button>
        <ul>
            <li v-for="(user,index) in userList" :key="user.id"><input type="checkbox">姓名:{{user.name}}</li>
            <!-- 原来key并不是区分不同的v-for,而是区分v-for之下的li标签。vue对于li标签的状态是有惰性的 -->
            <!-- 如果不设置li标签的key,在第一个li复选框被勾选上时,如果在其之上产生了新的标签,vue的状态惰性会将勾选状态继续保持 -->
            <!-- 如果加key,那么每一份状态就有了指定的标签归宿,解除了vue对于li标签状态的惰性 -->
            <!-- 但是index也是会被动态继承的,最好要使用从数据库查询过来的主键,本次使用的是user.id -->
        </ul>

    </div>


    <!-- 创建vue实例对象 -->
    <script>
        Vue.createApp({
          data:function() {
            return {  
                //{}中为对象
                user:{                
                    username:'zhangsan',
                    gender:'M',
                },
                desc:'<a href="http://www.baidu.com">百度</a>',
                message:'Hello vue!',
                link:"http://www.baidu.com",
                //文本框的占位符内容
                inputValue:'请输入内容',
                imgSrc:'./images/demo.png',
                w:'500px',
            }
          }
        }).mount('#app')

        Vue.createApp({
            data:function(){ //数据
                return{
                    count:0,
                    flag:false,
                }
            },
            methods:{  //自定义方法
                addCount(){
                    this.count+=1
                },
            }
        }).mount('#app0')

        Vue.createApp({
            data:function(){ //数据:后面都是后端传过来的数据,即实现前后端的联调
                return{
                    //用户列表
                    userList:[
                        {id:1,name:'zhangsan'},
                        {id:2,name:'lisi'},
                    ],
                    num:Math.random(),//生成1以内的随机数
                    //输入的用户名
                    name:'',
                    //下一个用户可用的id值
                    nextId:3,
                }
            },
            methods:{  //自定义方法,给数组的起始位置添加元素unshift
                addNewUser(){
                    this.userList.unshift({id:this.nextId,name:this.name})
                    //这个name大有文章,它是在输入框input中的v-model属性值。也就是说,它是一种更好的同步动态的value值,也就是输入框中的值
                    //每次添加user时如果不将this.name置空,那么添加完之后name不变,输入框中仍旧显示上一个添加的姓名,不会刷新,不方便每次从头开始写
                    this.name=''
                    this.nextId++
                },
            }
        }).mount('#app1')
      </script>
</body>
</html>

其实抽象来看就是三个部分:首先在<head>模块中导入vue的脚本文件,然后声明data(Model)和 id属性(View),然后通过Vue.createApp(data).mount(id)让二者连接,形成页面。


各模块分析

    <!-- 声明要被vue控制的DOM区域 -->
    <div id="app">
        {{message}} //第一种渲染方式{{}}:模板语法,两个花括号,可以将data中的数据直接做渲染.模板中只能有变量或者表达式,不能有语句.

        <!-- 变量可以随意使用JS的方法 -->
        {{message.split(" ").reverse().join('')}}
        <p>姓名:{{user.username+'是我'}}</p>

        <p>性别:{{user.gender}}</p>
        <p>{{desc}}</p>//默认将标签看成字符串

        <br>//渲染到标签里的地址
        <p v-html="desc">{{desc}}</p>//v-html为指令,后面加上对应的值,作用为将指定的变量以HTML的形式渲染出来
        <br>//渲染到属性里的地址 :/ v-bind:   不这样设置标签属性会默认把后面的变量当成字符串常量,加上冒号属性就会将""中的内容作为变量去读<br>
        <a :href="link">百度</a>
        <input type="text" :placeholder="inputValue">
        <img :src="imgSrc" :style="{width:w}" alt="">

    </div>

    <scirpt>
        Vue.createApp({
          data:function() {
            return {  
                //{}中为对象
                user:{                
                    username:'zhangsan',
                    gender:'M',
                },
                desc:'<a href="http://www.baidu.com">百度</a>',
                message:'Hello vue!',
                link:"http://www.baidu.com",
                //文本框的占位符内容
                inputValue:'请输入内容',
                imgSrc:'./images/demo.png',
                w:'500px',
            }
          }
        }).mount('#app')
    </script>

第一种渲染方式:{{ }}模板语法,两个花括号,可以将data中的数据直接做渲染。模板中只能有变量或者表达式,不能有语句。


    <div id="app0">

        <!-- 数据发生变化,页面会自动渲染刷新 -->
        <h3>count的值为: {{count}}</h3>
        <!-- 事件绑定指令 -->
        <button v-on:click="addCount">+1</button>
        <button @click="count+=1">+1</button> 
        <!-- 貌似之前on开头的都可以用@表示 -->


        <!-- 条件渲染指令:根据条件控制元素是否可以显示,比如豆瓣电影"新"标签是动态显示的-->
        <button @click="flag=!flag">Reverse Flag!</button>
        <!-- v-if:如果属性值为true,则渲染该标签 -->
        <p v-if="flag">请求成功 --- 被 v-if 控制</p>
        <p v-else>还没有成功捏</p>
        <!-- 注意v-else必须紧跟v-if之后! 可以加表达式比如  v-if="type==='A"实现真正的if判断语句-->

        <p v-show="flag">请求成功 --- 被 v-show 控制</p>
        <!-- 二者不同的地方在于,如果flag=false那么v-if所在的标签根本不会被创建,检查html源码的时候完全消失 -->
        <!-- 而v-show的标签会被创建,只不过通过增加CSS方式增加style="display:none;" -->
        如果该标签会经常切换显示/不显示,则建议使用v-show,只是增删属性效果,性能更高!不过v-if还有v-else!

    </div>

        Vue.createApp({
            data:function(){ //数据
                return{
                    count:0,
                    flag:false,
                }
            },
            methods:{  //自定义方法
                addCount(){
                    this.count+=1
                },
            }
        }).mount('#app0')

重点在于:v-if v-else,这是切换时常用的标签属性。

   <div id="app1">
        <!-- 列表渲染指令:后端返回多少数据,前端就渲染多少标签 -->
        <ul>
            <!-- 实际上写的只有一个li标签,但是能渲染很多 -->
            <li v-for="(user,i) in userList" :key="user.name">索引:{{i}},姓名:{{user.name}}</li>
            <!-- 也可以没有索引"user in userList"这样 -->
        </ul>

        <!-- v-for中的key,标记每一个li,给每一个使用v-for的li标签加上索引,否则组件化开发会报错 -->
        <input type="text" v-model="name">
        <!-- v-model双向绑定name的值,而且不用加 :以读取变量。如果页面发生变化则前端数据也会发生变化,数据变化则页面也会发生变化 -->
        <!-- 如果使用 :value="name",则为单向绑定,页面变化时原数据无法改变 -->
        <!-- 结合input,可以得出结论:用户输入的内容会自动影响name的属性值,会自动存储在前端data-return的name变量中了 -->
        <button @click="addNewUser">添加</button>
        <ul>
            <li v-for="(user,index) in userList" :key="user.id"><input type="checkbox">姓名:{{user.name}}</li>
            <!-- 原来key并不是区分不同的v-for,而是区分v-for之下的li标签。vue对于li标签的状态是有惰性的 -->
            <!-- 如果不设置li标签的key,在第一个li复选框被勾选上时,如果在其之上产生了新的标签,vue的状态惰性会将勾选状态继续保持 -->
            <!-- 如果加key,那么每一份状态就有了指定的标签归宿,解除了vue对于li标签状态的惰性 -->
            <!-- 但是index也是会被动态继承的,最好要使用从数据库查询过来的主键,本次使用的是user.id -->
        </ul>

    </div>

        Vue.createApp({
            data:function(){ //数据:后面都是后端传过来的数据,即实现前后端的联调
                return{
                    //用户列表
                    userList:[
                        {id:1,name:'zhangsan'},
                        {id:2,name:'lisi'},
                    ],
                    num:Math.random(),//生成1以内的随机数
                    //输入的用户名
                    name:'',
                    //下一个用户可用的id值
                    nextId:3,
                }
            },
            methods:{  //自定义方法,给数组的起始位置添加元素unshift
                addNewUser(){
                    this.userList.unshift({id:this.nextId,name:this.name})
                    //这个name大有文章,它是在输入框input中的v-model属性值。也就是说,它是一种更好的同步动态的value值,也就是输入框中的值
                    //每次添加user时如果不将this.name置空,那么添加完之后name不变,输入框中仍旧显示上一个添加的姓名,不会刷新,不方便每次从头开始写
                    this.name=''
                    this.nextId++
                },
            }
        }).mount('#app1')

重点是addNewUser方法的思想,每次提交后,姓名都清空,便于后续重新输入。
 

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

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

相关文章

【PCIe 5.0 - 10】Memory, I/O, and Configuration Request 规则

下列规则适用于所有 Memory, I/O, Configuration Requests&#xff0c;以下是针对各类请求的附加规则。 除通用 header 字段外&#xff0c;所有 Memory, I/O, 和 Configuration Requests 还包括以下字段&#xff1a; Requester ID[15:0] 和 Tag[9:0]&#xff0c;组成 Transact…

Easy-Laser激光测平仪维修易激光对中仪E920

Easy-Laser激光对中仪常见故障&#xff1a;触摸屏损坏&#xff08;屏碎&#xff0c;不显示&#xff0c;黑屏&#xff0c;蓝屏&#xff0c;无背光等&#xff09;&#xff0c;对中仪电路板损坏&#xff0c;对中仪接收装置电路板&#xff0c;对中仪发射控制装置电路板等均可维修。…

筋膜炎能自愈吗

筋膜炎的临床表现&#xff1a; 在发病前&#xff0c;通常有过度劳累的历史&#xff0c;剧烈运动、创伤、寒冷和上呼吸道感染也可能导致这种疾病。肢体皮肤肿胀&#xff0c;或皮肤红斑和关节活动有限。侵犯部位以下的下肢&#xff0c;特别是小腿&#xff0c;其次是前臂。损伤的…

高效率、低待机功耗TUHS15F12、TUHS25F05、TUHS25F12、TUHS25F24、TUHS5F05小型板载AC/DC转换器

简介 TUHS AC-DC转换器具有高效率、低待机功耗以及内置过流和过压保护电路。这些小型板安装AC-DC转换器在保持时间和预期寿命方面具有设计灵活性。该系列具有3W至26.4W的额定输出和AC85至264V、DC120至370V的通用输入电压。工作温度范围为-40C至85C。 引脚配置 规格参数 1、…

数据结构(四)--队列及面试常考的算法

一、队列介绍 1、定义 与栈相似&#xff0c;队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是LIFO&#xff08;后进先出&#xff09;&#xff0c;而队列是FIFO&#xff0c;即先进先出。 2、优缺点及使用场景 优点&#xff1a;先进先出&#xff08;FIFO&…

如何较为准确的测试自己的网速?

相对靠谱公正的20个测速网站(或APP或软件)大全&#xff08;不断更新中&#xff09; 一、电信宽带网页测速 网址&#xff1a;https://10000.gd.cn/#/speed 预览&#xff1a; 二、测速网 网址&#xff1a;测速网 - 专业测网速, 网速测试, 宽带提速, 游戏测速, 直播测速, 5G测…

Window下coturn服务器的搭建

Window下搭建coturn服务器&#xff1a; 准备材料&#xff1a; 1、安装Cygwin&#xff0c;地址&#xff1a;https://cygwin.com/install.html 由于Window无法直接部署coturn&#xff0c;因此需要下载安装Cygwin在Window上部署Linux虚拟环境。 在安装的时候需要安装几下packe…

Aigtek的ATA-7050高压放大器对比进口品牌TREK的609E-6

一、公司介绍 中国安泰&#xff1a;西安安泰电子科技有限公司是国内专业从事测量仪器研发生产和销售的高科技企业&#xff0c;公司依托西安交大、西北工业大学组建的科研团队&#xff0c;专注功率放大器、功率信号源等产品为核心的相关行业测试解决方案的研究&#xff0c;拥有国…

taro全局配置页面路由和tabBar页面跳转

有能力可以看官方文档&#xff1a;Taro 文档 页面路由配置&#xff0c;配置在app.config.ts里面的pages里&#xff1a; window用于设置小程序的状态栏、导航条、标题、窗口背景色&#xff0c;其配置项如下&#xff1a; tabBar配置&#xff1a;如果小程序是一个多 tab 应用&…

Node和Python遍历文件夹自动注入代码

需求是从文件夹中遍历检索多层级文件夹,找到其中文件取到上面namespace 后面的名称,在下面代码中自动注入动态代码: static displayName = "Test";下面使用node和python两种代码实现一下,方便对照学习 node代码 const fs = require(fs); const path = requir…

【算法|滑动窗口No.4】leetcode 485.最大连续 1 的个数 487.最大连续 1 的个数 II 1004. 最大连续1的个数 III

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

配置开启swap分区自定义大小

当前服务器swap分区是关闭状态&#xff0c;因服务需求需要开启swap分区 在 /data 目录下创建一个名为 swapfile 的文件&#xff0c;并将其大小设置为 8GB 注意这个操作占用的是/data目录的磁盘空间&#xff0c;要确保磁盘剩余空间大于设置的内存大小并且不影响磁盘空间的正常使…

10kb的WordPress外链页面安全跳转插件

老白博客我参照csdn和腾讯云的外链跳转页面&#xff0c;写了一个WordPress外链安全跳转插件&#xff1a;给网站所有第三方链接添加nofollow标签和重定向功能&#xff0c;提高网站安全性。插件包括两个样式&#xff0c;由于涉及到的css不太一样&#xff0c;所以分别写了两个版本…

测试从外包到自研再到大厂,这5年鬼知道我是怎么过来的

18岁那年我背井离乡来到从来没有来过的郑州。在一所普通的二本院校里学网络工程。 很明显&#xff0c;在大学以前只会用电脑开关机打LOL的我恍然间只觉得自己来到了人间天堂&#xff0c;没有人管&#xff0c;也没有任何烦恼无忧无虑的过了三年大学生涯。 直到秋招的开始&…

家政保洁团队服务预约小程序的效果如何

家政保洁可以是大公司也可以是小团队&#xff0c;但无论什么规格&#xff0c;其市场需求都是稳中有增&#xff0c;随着人们生活品质提升&#xff0c;其对居住环境/办公环境等都有一定要求&#xff0c;这意味着家政团队可以拓展同城乃至外地多个领域的生意。 但线下信息单一&am…

Python的web自动化学习(六)Selenium第一个网页操作

引言&#xff1a; 前面我们系统的介绍了一个各种selenium的工作原理、环境配置与准备、各种元素定位的方法&#xff0c;现在让我们一起来实践吧&#xff0c;以哔哩哔哩登录为例子说明&#xff1a; Selenium自动登录B站&#xff08;通过QQ登录&#xff09; 为什么使用qq登录&…

nodejs升级或降级

node有一个模块叫n&#xff0c;是专门用来管理node.js的版本。 升级或降级步骤 1 、安装n模块 npm install -g n 2、 升级node.js到最新稳定版 n stable Ps: n后面也可以跟随版本号&#xff08;用于升级或降级&#xff09;比如&#xff1a; n v16.12.0

白银期货投资指南,轻松搞定白银投资

在今天的金融市场中&#xff0c;白银已成为备受瞩目的投资选择。不仅如此&#xff0c;白银还是避险资产的首选之一&#xff0c;兼具保值和增值的潜力。万洲金业将为您提供一份白银期货投资指南&#xff0c;让您轻松了解白银投资&#xff0c;助力在白银交易市场获得潜在收益。 …

uniapp的启动页、开屏广告

uniapp的启动页、开屏广告 启动页配置广告开屏 启动页配置 在manifest.json文件中找到APP启动界面配置&#xff0c;可以看到有Android和iOS的启动页面的配置 &#xff0c;选择自定义启动图即可配置 广告开屏 在pages中新建一个广告开屏文件并在pases.json的最顶部配置这个页…

嵌入式应用选择正确的系统设计方法:第三部分

产品质量低下的原因有很多&#xff0c;例如&#xff0c;产品制造粗糙&#xff0c;组件设计不当&#xff0c;架构不佳以及对产品的要求了解不多。点击领取嵌入式物联网学习路线 必须设计质量。 您不能测试出足够的错误来交付高质量的产品。的质量保证&#xff08;QA&#xff09…