vue3的基本使用(步骤,架构模式,调试工具,指令)

news2024/9/26 5:18:29

1.基本使用步骤

a.导入vue.js的script脚本文件(自动为window对象挂载vue构造函数)

b.在页面中声明一个将要被vue控制的Dom区域

c.创建vue实例对象

<body>
    <div id="app">
        {{msg}}
    </div>
</body>
</html>
<script src="./vue3.js"></script>
<script>
    let app = Vue.createApp({
        data(){
            return{
                msg:'123'
            }
        }
    })
    app.mount('#app')
</script>

data指向的对象是Model数据源

div是View视图区域

vue实例对象就是ViewModel

2.MVVM项目的架构模式

M:model,模型:

主要完成业务功能,在数据库相关的项目中,数据库的增删改查属于模型(重点)。(nodeJS中的db文件夹),没有页面,是纯粹的逻辑

V:view,视图:

主要负责数据的显示(HTML+CSS,动态网页(jsp,含有html的php文件))页面的展示和用户的交互。

VM:ViewModel

主要完成M和V的数据通信,并且是双向绑定。而 View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作 DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。

3.vue调试工具

a.chrome浏览器右上角三个点图标,点击设置,

b.点击扩展程序,在应用商店搜索扩展程序vue.js devtools,添加至chroma,

c.详情:允许此扩展程序读取和更改您在所访问的网站上留存的所有数据,在所有网站上,打开允许访问文件网址

d.重启浏览器

e.点击调试面板最右侧vue

4.vue指令

指令是vue为开发者提供的模板语法,用于辅助开发者渲染页面的基本结构

a.内容渲染指令v-text,  v-html,  {{}}

b.属性绑定指令v-bind

c.事件绑定指令v-on

d.双向绑定指令v-model

e.条件渲染指令v-if,v-else-if,v-else,v-show

f.列表渲染指令v-for

<body>
    <div id="app">
        <!--1. v-text和插值表达式只能渲染纯文本内容。v-html会把包含html标签的字符串渲染为页面的html元素 -->
        <p>{{msg}}</p>
        <p v-text="msg"></p>
        <p v-html="msg"></p>
        <p>{{str}}</p>
        <p v-text="str"></p>
        <p v-html="str"></p>
        <!-- 2.为元素的属性绑定属性值,v-bind可省略 -->
        <input type="text" v-bind:placeholder="placeholder">
        <img v-bind:src="src" alt="">
        <!-- 3.事件绑定v-on:click,v-on:input,v-on:keyup,简写@click ,当事件处理函数中的代码简单,可简写到行内-->
        <button v-on:click="fn1">按钮1</button>
        <button v-on:click="msg+='123'">按钮1</button>
        <button v-on:click="fn2('123',$event)">按钮2</button>
        <!-- 事件修饰符.prevent阻止默认行为,.stop阻止事件冒泡,.capture以捕获方式处理当前事件,.once只触发一次,.self当前元素自身触发 -->
        <a href="http://www.baidu.com" @click.prevent="onLinkClick">百度</a>
        <div class="outer" @click="outerClick">
            <div class="inner"  @click.stop="innerClick"></div>
        </div>
        <!-- 事件默认以冒泡形式执行,加capture以捕获形式执行,从外到里 -->
        <div class="outer" @click.capture="outerClick">
            <div class="inner"  @click="innerClick"></div>
        </div>
        <div class="inner"  @click.once="innerClick"></div>
        <!-- 里中外冒泡执行,不执行以冒泡形式触发的事件加上self -->
        <div class="box" @click="boxClick" >
            <div class="outer" @click.self="outerClick">
                <div class="inner"  @click="innerClick"></div>
            </div>
        </div>
        <!-- 按键修饰符 -->
        <input type="text" @keyup.enter="submit" @keyup.esc="clear">
    </div>
</body>
</html>
<script src="./vue3.js"></script>
<script>
    let app = Vue.createApp({
        data(){
            return{
                msg:'123',
                str:'<b>b</b>',
                placeholder:'hello',
                src:"./001.png"
            }
        },
        methods:{
            fn1(e){
                console.log('按钮1');
                // 接受事件对象event
                const nowBgColor=e.target.style.backgroundColor;
                e.target.style.backgroundColor=nowBgColor==='red'?'':'red'
            },
            fn2(str,e){
                this.msg+=str;
                const nowBgColor=e.target.style.backgroundColor;
                e.target.style.backgroundColor=nowBgColor==='red'?'':'red'
            },
            onLinkClick(){
                alert('ok')
            },
            outerClick(){
                alert('outerClick')
            },
            innerClick(){
                alert('innerClick')
            },
            boxClick(){
                alert('boxClick')
            },
            submit(e){
                alert(`按键${e.target.value}`)
            },
            clear(e){
                e.target.value=''
            }
        }
    })
    app.mount('#app')
</script>
<body>
    <div id="app">
        <!-- 4.双向绑定 -->
        <!-- 输入框 -->
        <p><input type="text" v-model="value">{{value}}</p>
        <!-- 下拉选择框 -->
        <select v-model="num" name="" id="">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
        </select>
        {{num}}
        <!-- 单选框 -->
        <input type="radio" v-model="istrue" value="yes" id="yes"><label for="yes">yes</label>
        <input type="radio" v-model="istrue" value="no" id="no"><label for="no">no</label>
        <!-- 单个复选框 -->
        <p><input type="checkbox" v-model="isCheckd">xxxx</p>
        <!-- 复选框 -->
        <input type="checkbox" v-model="arr" value="aaaa">aaaa
        <input type="checkbox" v-model="arr" value="bbbb">bbbb
        <input type="checkbox" v-model="arr" value="cccc">cccc
        {{arr}}
        <!-- v-model指令修饰符.number,.trim,.lazy -->
        <p><input type="text" v-model.number="value">{{value}}</p>
        <p><input type="text" v-model.trim="value">{{value}}</p>
        <p><input type="text" v-model.lazy="value">{{value}}</p>
        <!-- 使用了lazy后,在失去焦点时更新value,而不是在输入时更新 -->
        <!--5.条件渲染  -->
        <button v-if="flag" @click="clickFn">按钮1</button>
        <button v-show="flag"@click="clickFn">按钮2</button>
        <p v-if="type==='A'">优秀</p>
        <p v-else-if="type==='B'">良好</p>
        <p v-else-if="type==='C'">一般</p>
        <p v-else>差</p>
        <!-- 6.列表渲染v-for -->
        <div v-for="(item,index) in arr1" :key="item">{{index}}{{item}}</div>
        <div v-for="(value,key) in obj">{{key}}{{value}}</div>
        <div v-for="(item,index) in str">{{index}}{{item}}</div>
        <!-- 嵌套循环 -->
        <div v-for="(item,index) in objArr">
          <p v-for="(v,k) in item">{{k}}{{v}}</p>
        </div>
        <div v-for="(item,index) in objArr" :key="item">
            <input type="checkbox">
          {{index}}{{item.a}}
        </div>
        <button @click="addFn">key</button>
    </div>
</body>

<script src="./vue3.js"></script>
<script>
    let app = Vue.createApp({
        data(){
            return{
                value:'',
                num:'',
                istrue:'no',
                isCheckd:true,
                arr:[],
                flag:true,
                type:'D',
                arr1:['1a','2b','3c','4d'],
                objArr:[{
                    a:"1aaaaaaaa",
                    b:"1bbbbbbbbbbbbb",
                    c:"1cccccccccccc",
                    d:"1dddddddddd"
                },{
                    a:"2aaaaaaaa",
                    b:"2bbbbbbbbbbbbb",
                    c:"2cccccccccccc",
                    d:"2dddddddddd"
                }],
                obj:{
                    a:"1aaaaaaaa",
                    b:"1bbbbbbbbbbbbb",
                    c:"1cccccccccccc",
                    d:"1dddddddddd"
                }
                    }
                },
        methods:{
            clickFn(){
                this.flag=!this.flag  
            },
            addFn(){
                this.objArr.unshift({
                    a:`${Math.random()*10}aaaaaaaa`,
                    b:`${Math.random()*10}bbbbbbbbbbbbb`,
                    c:`${Math.random()*10}cccccccccccc`,
                    d:`${Math.random()*10}dddddddddd`
                })
            }
        }
    })
    app.mount('#app')
</script>

v-if和v-show的区别

实现原理不同

v-if指令会动态的创建或移出dom元素,

v-show会动态添加或移出style="display:none;"样式

性能消耗

v-if有更高的切换开销,v-show有更高的初始渲染开销。

频繁切换使用v-show。如果运行时条件很少改变,使用v-if

v-for中的key

当列表的数据发生表示变化时,vue会尽可能地复用已存在的dom元素,从而提升渲染的性能。但这种默认的性能优化策略,会导致有状态的列表无法被正确更新。需要为每项提供一个唯一的key属性。

key的值只能是字符串或数字类型,必须具有唯一性,建议把数据项id属性作为key,使用index的值作为key值没有任何意义。

5.简单案例

<body>
    <div id="app">
        <div class="top">
            <h4>添加品牌</h4>
            <p>
                <input class="goodVal" type="text" v-model.trim="goodVal">
                <button @click="addFn">添加品牌</button>
            </p>
        </div>
        <div class="bottom">
            <table>
                <tr>
                    <td class="goodId">#</td>
                    <td class="goodName">名称</td>
                    <td class="goodState">状态</td>
                    <td class="goodTime">时间</td>
                    <td class="goodAction">操作</td>
                </tr>
                <tr v-for="(item,index) in goods" :key="item.id">
                    <td class="goodId">{{index+1}}</td>
                    <td class="goodName">{{item.name}}</td>
                    <td class="goodState">
                        <input type="checkbox" v-model="item.state" :id="item.id">
                        <label :for="item.id">{{item.state===true?"上架":"下架"}}</label>
                    </td>
                    <td class="goodTime">{{item.time}}</td>
                    <td class="goodAction"><u @click="clearFn(item.id)">删除</u></td>
                </tr>
            </table>
        </div>
    </div>
</body>
</html>
<script src="./vue3.js"></script>
<script>
    let app = Vue.createApp({
        data(){
            return{
                msg:'hello',
                goodVal:"",
                goods:[{
                    id:'1',
                    name:'苹果',
                    state:true,
                    time:'2020-11-03 11:00:00'
                },
                {
                    id:'2',
                    name:'梨',
                    state:true,
                    time:'2020-11-03 11:00:00'
                },
                {
                    id:'3',
                    name:'香蕉',
                    state:true,
                    time:'2020-11-03 11:00:00'
                }]
            }
        },
        methods:{
            clearFn(id){
                this.goods = this.goods.filter((item)=>{
                    return item.id !== id;
                })
            },
            addFn(){
                if(this.goodVal==''){
                    alert('请输入添加内容');
                    return;
                }
                let obj={
                    id:  Math.random()*10,
                    name:this.goodVal,
                    state:true,
                    time: this.formatTime()
                }
                this.goods.push(obj);
                this.goodVal='';
            },
            formatTime(){
                let dt=new Date()
                let y=dt.getFullYear();
                let m=this.padZero(dt.getMonth()+1);
                let d=this.padZero(dt.getDate());
                let hh=this.padZero(dt.getHours());
                let mm=this.padZero(dt.getMinutes());
                let ss=this.padZero(dt.getSeconds());
                return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
            },
            padZero(n){
                console.log(n);
                return n>9 ? n:'0'+ n
            }
        }
    })
    app.mount('#app')
</script>

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

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

相关文章

树形弹窗选择框/vue2/Element/弹框选择

前言 此类选择器根据vueelementUI实现&#xff0c;使用vue3的可以根据此案例稍作改动即可实现&#xff0c;主要功能有弹出选择、搜索过滤、搜索结果高亮等&#xff0c;此选择器只支持单选&#xff0c;如需多选可在此基础进行改造。 效果图 代码实现 使用时&#xff0c;props-…

文件备份的方法有哪些?应该怎么弄?分享六个高效便捷的电脑文件备份方法

我们的电脑中存储了大量重要文件&#xff0c;如照片、文档、视频以及重要资料等。 然而&#xff0c;面对突如其来的硬件故障、病毒攻击或人为误操作&#xff0c;这些数据仿佛都悬于一线。 虽然说可以选择的恢复方法有很多&#xff0c;但是没有任何一个方法可以做到100%的&…

【Mysql】记录sql在执行过程中很慢

在改之前的测试脚本,之前写了一些sql,这次准备顺手把sql也调整一下,因为虽然sql能用&#xff0c;但是写的十分拉跨 附sql 分析过程: 1. 初步推测慢主要是因为left join了好几张表。 然后我去查了也跟开发求证过sql在执行过程中是"先联表&#xff0c;再执行查询条件"…

SCADA|KingSCADA运行报错:加载网络服务失败

哈喽,你好啊,我是雷工! 今天要运行KingSCADA程序时报错:加载 网络服务失败 ,导致无法运行。 解决问题思路及过程记录如下: 01 问题描述 如下图所示,报加载 网络服务失败 ; 02 处理过程 软件运行信息窗口中会有详细的运行信息,可以先查看软件的信息窗口。 也可以在日…

bluez SPP使用

然后退出bluetoothctl&#xff0c;执行rfcomm listen /dev/rfcomm0 1&#xff0c;如果已被使用&#xff0c;则执行rfcomm release 0(执行该命令会有数据回显&#xff0c;既手机收到开发板发来的相同数据&#xff0c;若要关闭回显需要加上参数-r&#xff0c;开启raw mode) 手机上…

项目中常用注解整理

Mybatis/MybatisPlus TableName //用来将指定的数据库表和 JavaBean 进行映射TableId(type IdType.AUTO) //标记为数据库中的主键TableField(existfalse) //标记为数据库中不存在的字段&#xff0c;防止报错Paramparam标签提供了对某个函数的参数的各项说明&#xff0c;包括参…

CTF 竞赛密码学方向学习路径规划

目录 计算机科学基础计算机科学概念的引入、兴趣的引导开发环境的配置与常用工具的安装Watt Toolkit&#xff08;Steam&#xff09;、机场代理Scoop&#xff08;Windows 用户可选&#xff09;常用 Python 库SageMathLinux小工具 yafuOpenSSL Markdown编程基础Python其他编程语言…

@老板:图纸防泄密方法有哪些?图纸防泄密高招分享

图纸&#xff0c;就像是企业的秘密武器设计图纸&#xff0c;里面藏着产品的精髓和创新的火花。一旦这些图纸落入竞争对手之手&#xff0c;就像是自家的独门秘籍被外人偷学&#xff0c;后果不堪设想。因此&#xff0c;保护图纸不泄密&#xff0c;是每个企业都必须认真对待的大事…

【QT】常用类

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;QMediaPlayer&#x1f449;&#x1f3fb;QMediaPlaylistsetPlaybackMode &#x1f449;&#x1f3fb;QDir&#x1f449;…

stm32驱动HX711称重传感器 c++代码分享

一、HX711模块介绍 HX711模块是一种专门用于称重传感器的放大器模块。它的主要功能是将测得的微小电压信号放大到可以被微控制器读取的范围。 HX711模块通常配合称重传感器一起使用&#xff0c;例如压力传感器、负载细胞等。它采用24位的模数转换器&#xff08;ADC&#xff09…

交叉熵函数与kl散度的区别

公式上的区别 手动计算的方式展示如何实现这两个损失函数 交叉熵损失函数 import torch import torch.nn.functional as F# 模型的输出 logits 和真实标签 target logits torch.tensor([[2.0, 0.5, 0.1], [0.3, 2.5, 0.8]], requires_gradTrue) target torch.tensor([0, 1])…

测试开发基础——软件测试中的bug

二、软件测试中的Bug 1. 软件测试的生命周期 软件测试贯穿于软件的整个生命周期 需求分析 测试计划 测试设计与开发 测试执行 测试评估 上线 运行维护 用户角度&#xff1a;软件需求是否合理 技术角度&#xff1a;技术上是否可行&#xff0c;是否还有优化空间 测试角度…

某郊到家:互联网时代下的按摩服务革新

在快速发展的时代背景下&#xff0c;一群具有前瞻性的企业家在2018年勇敢地进军了按摩服务行业&#xff0c;引领了一场对传统模式的革新。他们不仅在竞争激烈的市场中站稳脚跟&#xff0c;还成功地在不断变化的市场环境中确立了自己的位置。 创新的商业模式和持续的努力&#x…

【2024】前端学习笔记2-有序列表-无序列表-描述列表

学习笔记 有序列表:ol基本使用:嵌套使用扩展:使用CSS改变序号类型无序列表:ul基本使用扩展:使用CSS改变符号类型扩展:使用CSS定制列表样式描述列表:dl基本使用扩展:使用CSS定制类型格式总结有序列表:ol 有序列表由<ol>标签包裹一组<li>(列表项)标签组成…

区块链之变:揭秘Web3对互联网的全面改变

随着技术的进步&#xff0c;区块链 逐渐从一个相对小众的概念演变为重塑互联网结构的核心力量。特别是 Web3 的兴起&#xff0c;标志着互联网进入了一个新的发展阶段。这一变革不仅仅是技术的升级&#xff0c;更是对互联网功能、数据控制和用户体验的全面重新定义。本文将详细探…

数学建模笔记—— 回归分析

数学建模笔记—— 回归分析 回归分析1. 回归分析的一般步骤2. 一元线性回归分析2.1 具体过程2.1.1 确定回归方程中的解释变量和被解释变量2.1.2 确定回归模型和建立回归方程2.1.3 利用回归直线进行估计和预测2.1.4 对回归方程进行各种检验(补充)1. 回归直线的拟合优度2. 显著性…

哪款提醒软件能清晰展示每日工作任务?

在快节奏的工作环境中&#xff0c;每天的工作任务堆积如山&#xff0c;如何有效地整理和清晰查看这些任务&#xff0c;成为了提高工作效率的关键。一款优秀的提醒软件能够帮助我们将任务条理化&#xff0c;确保每一项工作都能按时完成。 敬业签就是这样一款能够清晰展示每日工…

VR 尺寸美学主观评价-解决方案-现场体验研讨会报名

棣拓科技VR创新解决方案助力尺寸美学所见即所得! 诚邀各位行业专家莅临指导交流 请扫描海报二维码踊跃报名&#xff0c;谢谢 中国上海 2024.10.25 亮点介绍 1、通过精湛渲染技术&#xff0c;最真实展现设计效果&#xff0c;并通过VR设备一比一比例进行展现。 2、设置相关设…

suid提权的环境搭建+反弹shell

SUID&#xff08;Set User ID&#xff09;是一种特殊的文件权限设置&#xff0c;它允许文件在执行时具有文件所有者的权限。当具有SUID权限的文件被执行时&#xff0c;执行该文件的用户会暂时获得文件所有者的权限。这种权限通常用于需要高权限操作的程序&#xff0c;如‌passw…

建筑用能该如何统一管理?水电气集抄太麻烦?!看看这个吧!建筑能耗分析管理系统 您的运维“好帮手”

安科瑞刘鸿鹏 随着工业化和信息化进程的加速&#xff0c;企业对能源管理的需求愈加迫切。安科瑞电气股份有限公司推出的Acrel-5000能耗管理系统运用物联网技术&#xff0c;实时采集电表、水表、燃气表等能源计量仪表的数据&#xff0c;并结合大数据技术进行处理和存储。该平台旨…