Vue教程(一):Vue核心

news2024/11/26 11:54:50

Vue教程(一):Vue核心

1.1 Vue简介

1.1.1 Vue是什么?

一套用于构建用户界面渐进式JS框架。

1.1.2 谁开发的?

——尤雨溪。

  • 2015-10-27 正式发布 Vue1.0.0 Evangelion(新世纪福音战士)
  • 2016-10-1 正式发布 Vue 2.0.0 (工壳机动队)
  • 2020-9-18 正式发布 Vue 3.0.0 (海贼王)

1.1.3 Vue的特点

  1. 采用组件化模式,提高代码复用率、且让代码更好维护。
  2. 声明式编码,让编码人员无需直接操作DOM,提高开发效率。
  3. 使用虚拟DOM+优秀的Diff算法,尽量复用DOM节点。

1.1.4 学习Vue之前要掌握的JavaScript基础知识

  • ES6语法规范
  • ES6模块化
  • 包管理器
  • 原型、原型链
  • 数组常用方法
  • axios
  • promise

1.1.5 Vue官网使用指南

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FomWRbNw-1689559654954)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220818130734982.png)]

1.1.6 搭建VUE开发环境

Vue.config.productionTip = false;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UH3cv6Sx-1689559654955)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220818155656396.png)]

1.2 初始Vue

1.2.1 Hello小案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初识vue</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        初识Vue:
            想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象
            root容器里的代码依然符合html规范,只不过混入了一些特殊的语法
            root容器里的代码称为【Vue模版】

            注意区分:js表达式 和 js代码(语句)
                1、表达式:一个表达式会生成一个值,可以放在任何一个需要的地方:
                    (1).a
                    (2).a+b
                    (3).demo(1)
                    (4).x === y ? 'a' : 'b'
                2、js代码(语句)不生成值,控制代码走向
                    (1). if(){}
                    (2). for(){}
     -->
    <!-- 准备一个容器 -->
    <div id="root">
        <h1>Hello, {{name}},{{address}},{{Date.now()}}</h1>
        <button>Test</button>
    </div>
    <!-- <div id="root2">
        <h1>Hello, {{address}}</h1>
    </div> -->
<script>
    // 设置为 false 以阻止 vue 在启动时生成生产提示。
    Vue.config.productionTip = false;

    // 创建Vue实例
    new Vue({
        // el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串
        el: '#root',
        data: {
            // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。
            name: 'wang',
            address: '武汉'
        }
    })

    // new Vue({
    //     // el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串
    //     el: '#root2',
    //     data: {
    //         // data用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。
    //         address: '武汉',
    //     }
    // })
    
</script>

</body>
</html>

1.2.2 总结

  1. 想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象
  2. root容器里的代码依然符合html规范,只不过混入了一些特殊的语法
  3. root容器里的代码称为【Vue模版】
  4. Vue实例和容器是一一对应
  5. 真实开发中只有一个Vue实例,并且会配合着组件一起使用
  6. {{xxx}}中的xxx要写js表达式,且xxx可以自动读取到data中的数据
  7. 一旦data中的数据发生改变,那么模版中用到该数据的地方也会自动更新

1.3 模版语法

1.3.1 效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uQbbLFOq-1689559654955)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220927093230720.png)]

1.3.2 总结

  • Vue模版语法有两大类:
    1. 差值语法
      • 功能:用于解析标签体内容
      • 写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性
    2. 指令语法
      • 功能:用于解析标签(包括:标签属性、标签体内容、绑定事件)
      • 举例:v-bind:href="xxx" 或简写为 :href="xxx",xxx同样要写js表达式,且可以直接读取到data中的所有属性。
      • 备注:Vue中有很多指令,且形式都是:v-???,此处我们只是拿v-bind举个例子

1.4 数据绑定

1.4.1 效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1UvSvbgp-1689559654956)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220927094657446.png)]

1.4.2 单向数据绑定

v-bind

单向数据绑定:<input type="text" v-bind:value="name"/><br/>

1.4.3 双向数据绑定

v-model

双向数据绑定:<input type="text" v-model:value="name"/>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q4nMvSSv-1689559654956)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220927094429401.png)]

1.4.4 总结

  • Vue中有2两种数据绑定的方式
    1. 单向绑定(v-bind):是关于只能从data流向页面
    2. 双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data
      • 备注:
        1. 双向绑定一般都应用在表单类元素上,如input、select
        2. v-model:value 可以简写为v-model,因为v-model默认收集的就是value

简写方式:

<!-- 简写 -->
单向数据绑定:<input type="text" :value="name"/><br/>
双向数据绑定:<input type="text" v-model="name"/>

1.5 el与data的两种写法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DhDUVWlY-1689559654956)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220927095642175.png)]

1.5.1 el的两种写法

// el的两种写法
    const v = new Vue({
        // 第一种写法
        el: '#root',
        data:{
            name: 'jack',
        }
    })
    console.log(v)
    
    // 等待1秒再进行绑定
    setTimeout(() => {
        // 第二种写法,有挂载的意思mount
        v.$mount('#root')
    }, 1000);

1.5.2 data的两种写法

// data的两种写法
    new Vue({
        el: '#root',
        // data的第一种写法
        // data:{
        //     name: 'jack'
        // }
        // data的第二种写法
        data(){
            return{
                name: 'jack'
            }
        }
    })

1.5.3 总结

  • el与data的两种写法
    1. el的两种写法
      • new Vue时候配置el属性
      • 先创建Vue实例,随后再通过vm.$mount(‘#root’)指定el的值
    2. data的2种写法
      • 对象式
      • 函数式
    3. 一个重要的原则:
      • 由Vue管理的函数,一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了,因为箭头函数没有自己的this,只能往外找,就找到了window

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NPKso2KE-1689559654957)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220927100929045.png)]

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-65oiPbEC-1689559654957)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20220927101020835.png)]

1.6 MVVM模型

  1. M:模型(Model):对应data中的数据
  2. V:视图(View):模版
  3. VM:视图模型(ViewModel):Vue实例对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zzLhqQNO-1689559654957)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221014081758558.png)]

data中所有的属性,最后都出现在了vm身上。vm身上的所有属性,及vue原型上所有属性,在vue模版中都可以直接使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kzXPkd4p-1689559654958)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221014082646003.png)]

1.7 Object.defineProperty

是否可以枚举

**需求:**给张三添加一个属性年龄age,值是18.

Object.defineProperty(person, 'age',{
        value:18
    })

仔细看到,age的颜色和name、sex颜色不同。说明age是不可枚举的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0LFA9J9I-1689559654958)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221014083410273.png)]

这里说明什么是不可枚举:

首先,我们直接给person,加上age属性,然后打印出person的key有哪些

<script type="text/javascript">
    Vue.config.productionTip = false;

    let person = {
        name:'张三',
        sex:'男',
        age:18
    }

    //Object.defineProperty(person, 'age',{
        //value:18
    //})
    console.log(Object.keys(person));
    console.log(person);
</script>

去浏览器查看打印的结果,是可以看到age属性的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fw9pEImq-1689559654958)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221014083933681.png)]

但是,当我们通过Object.defineProperty给person添加age属性的时候,打印的时候,这里的age是无法取到的,这就是此时的age不可枚举。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zk12zUnv-1689559654958)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221014083901738.png)]

但是,也可以通过设置另外一个属性,设置age可枚举,通过属性enumerable即可设置,代码如下:

Object.defineProperty(person, 'age',{
        value:18,
        enumerable: true, //控制属性是否可以枚举,默认值是false
    })

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8aw3rZ1H-1689559654959)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221014084232227.png)]

是否可以修改

这里的writable控制属性是否可以被修改,默认值是false

Object.defineProperty(person, 'age',{
        value:18,
        enumerable: true,
        writable: true,
    })

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TnGXhj93-1689559654959)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221019082245690.png)]

是否可以删除

直接写在let person里面的属性是可以直接删除的,比如name属性。

let person = {
        name:'张三',
        sex:'男',
        // age:18
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YnIKbX2q-1689559654960)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221019082450019.png)]

但是,写在defineProperty里面的属性是不能删除的,比如age属性

    Object.defineProperty(person, 'age',{
        value:18,
        enumerable: true,
        writable: true,
    })

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCNpZX7a-1689559654960)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221019082522894.png)]

可以设置configurable: true这个属性,来设置可以删除某个属,可以看到删除成功

    Object.defineProperty(person, 'age',{
        value:18,
        enumerable: true,
        writable: true,
        configurable: true,
    })

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LUxE9GTN-1689559654960)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221019082810899.png)]

另一个需求 get()

当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值

初始代码

let number = 18;
    let person = {
        name:'张三',
        sex:'男',
        age: number,
    }

我修改number的值,age也要跟着变

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JU2GtvE8-1689559654960)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221019083418087.png)]

修改代码

Object.defineProperty(person, 'age',{
        // value:18,
        // enumerable: true,
        // writable: true,
        // configurable: true,
        // 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
        get(){
            return number;
        }
    })

打印结果成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PzTaeC3u-1689559654961)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221019083837980.png)]

set()函数

当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值

Object.defineProperty(person, 'age',{
        // value:18,
        // enumerable: true,
        // writable: true,
        // configurable: true,
        // 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
        get(){
            return number;
        },
        // 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
        set(value){
            console.log('有人修改了age属性,且值是', value);
        }
    })

查看结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y7O1liQP-1689559654961)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221019084130948.png)]

整体输出一下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jicEthNk-1689559654961)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221019084349106.png)]

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

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

相关文章

【苹果日历推送】群发部署开发工具、SDK或框架,如APNs推送服务的HTTP/2接口

苹果日历本身并不直接支持群发推送通知&#xff0c;因为推送通知是针对单个设备的。如果你想向多个用户发送推送通知&#xff0c;你需要在自己的应用中实现推送功能&#xff0c;然后针对每个设备单独发送推送通知。 以下是实现推送通知的一般步骤&#xff1a; 开发推送服务&a…

【产品设计】通用后台管理系统需求及原型设计

后台管理系统&#xff0c;会根据不同公司、不同业务的要求做出改变。 网上很多系统的参考多数为业务中台&#xff0c;过于带有业务色彩。做过三四个后台管理系统&#xff0c;从中总结了一个通用的功能和需求设计模版&#xff0c;供大家参考。本文适用于0-2岁的产品经理做基础功…

如何用Jmeter做性能测试

目录 性能测试的概念 性能测试类型 性能测试应用场景&#xff08;领域&#xff09; 性能测试常用的指标 性能测试流程 需求分析 搭建测试环境 测试场景设计 测试用例设计和脚本开发 测试数据准备 性能测试执行和管理 性能测试结果分析与调优 测试报告和跟踪 性能测…

头版!《大同日报》和《大同晚报》报道大同互联网职业技术学院建设进程

近日&#xff0c;传智黑马主办的全日制统招大学——大同互联网职业技术学院备受关注&#xff0c;继前几日大同电视台采访我校&#xff0c;《大同日报》和《大同晚报》又在头版头条对我校的工程建设情况进行了详实报道。作为2023年省市两级重点工程项目&#xff0c;报道对我校在…

存量市场下,雅迪的高端化之路举步维艰?

为了让自家的高端产品成功“突围”&#xff0c;雅迪在营销上无所不用其极。 继在央视大楼高调发布后&#xff0c;近日雅迪冠能探索E10完成了力战70吨游艇、无惧24吨雨水冲刷、制霸百公里全地形等极限挑战&#xff0c;“树立起新一代两轮电动车豪华标杆旗舰”。 图源&#xff1…

cjson坑系列二cJSON_AddStringToObject、cJSON_AddItemToObject申请内存失败

在使用cjson的时候遇见这样一个问题&#xff08;先看问题代码&#xff0c;如下&#xff09; void platform_set_matrix_by_udp(cJSON* para, const char* str) {char* chintstr NULL, * intstr NULL;cJSON* index, * val;int ch;char* matrix;int number 0;int rows[8] { …

数仓学习---8、数仓开发之ODS层

星光下的赶路人star的个人主页 大鹏一日同风起&#xff0c;扶摇直上九万里 文章目录 一、数仓开发之ODS层1.1 日志表1.2 业务表1.2.1 活动信息表&#xff08;全量表&#xff09;1.2.2 活动规则表&#xff08;全量表&#xff09;1.2.3 一级品类表&#xff08;全量表&#xff09;…

测试开发面试你需要知道的

面试前的准备&#xff1a; 1.简历优化 选择一个比较简洁明了的模板&#xff0c;简历中突出自己的技能和项目经验&#xff0c;项目经历最好按照时间倒叙阐述&#xff0c;描述清自己在项目中承担的职责&#xff0c;在这个职责中做的一些过程改进&#xff0c;效率提升的内容&…

【ChatGLM】在电脑部署属于自己的人工智能/ChatGPT平替/可离线/可发布

【ChatGLM】在电脑部署属于自己的人工智能 1、 前言 本文能实现在自己的电脑或云服务器上部署属于自己的语言AI——ChatGLM-6B&#xff0c;可以离线使用&#xff0c;也可以生成web网页在线发给朋友尝试。 ChatGLM-6B 是一个由清华大学的团队开源的、支持中英双语问答的对话语…

Spring Batch之读数据库—JdbcPagingItemReader(四十一)

一、JdbcPagingItemReader Spring Batch框架提供了对JDBC分页读取支持的组件JdbcPagingItemReader。JdbcPaginItemReader实现ItemReader接口&#xff0c;核心作用是将数据库中记录通过分页的方式转换为Java对象。在JdbcPagingItemReader将数据库记录转换为Java对象是主要有两步…

浅谈KNX协议智能照明系统在某图书馆中的应用

安科瑞 华楠 摘要&#xff1a;文章介绍了KNX/EIB智能照明控制系统的组成&#xff0c;结合工程实例&#xff0c;介绍了应用KNX/ EIB技术&#xff0c;进行智能照明控制系统方案设计的方法和原理&#xff0c;细致深入的对这一个系统在图书馆类建筑应用的节能性与便利性。 关键词&…

Jason Arbon提问Claude 2.0,全球现在有多少测试人员/有多少条测试用例?答案出乎意料

相信在大家的心目中&#xff0c;ChatGPT无疑是AI届的扛把子&#xff0c;自打推出以来&#xff0c;一骑绝尘&#xff0c;问谁谁都说好&#xff0c;问啥啥都能干。无论是国外的Google Bard、还是国内的文心一言、通义千问等都不是他的一合之敌。但是最近Anthropic新推出的Claude …

Python:基于matplotlib与mayavi的3D可视化(点云+等值面)

文章目录 一、3D可视化常用方法二、三维图像在numpy、cv2、以及tifffile.imread中通道的区别三、项目实战 1、基于matplotlib的3D可视化&#xff08;体素体&#xff09; 2、基于mayavi的3D可视化2.0、mayavi使用指南&#xff08;鼠标&#xff09;2.1、mlab.points3d()参数详解…

瀑布流布局(multi-column多列布局)

效果展示&#xff1a; 瀑布流布局是网页设计常见的一种布局&#xff0c;一般用于图片多列展示。列宽固定&#xff0c;图片根据自身高度自适应交错排列。 特点&#xff1a; 等宽不等高&#xff0c;多列布局&#xff1b;随着页面滚动条向下滚动&#xff0c;不断加载数据块并附加…

浅谈一下企业IT运维痛点以及好用的运维软件推荐

随着IT建设的不断深入和完善&#xff0c;IT资产越来越多&#xff0c;IT运维管理越发显得重要。但不少企业不知道如何有效进行IT运维&#xff0c;不知道如何更好进行IT运维&#xff0c;今天我们就来一起浅谈一下企业IT运维痛点&#xff0c;以及给大家推荐一款好用的运维管理软件…

国内外接口文档工具哪家强?ApiManager-在线接口文档管理工具

下面是关于接口文档工具-在线接口文档管理工具 接口文档是贯穿整个开发项目流程中的规范&#xff0c;前后端开发需要在开发前期进行接口定义并形成文档&#xff0c;测试人员在功能测试和接口测试的环节也需要对这些接口文档进行测试。 然而随着开发版本迭代&#xff0c;很多接…

Hadoop——Windows系统下Hadoop单机环境搭建

为了便于开发&#xff0c;我在本地Windows系统进行Hadoop搭建。 我使用的版本&#xff1a;hadoop-2.7.0。其他版本也可&#xff0c;搭建流程基本一样&#xff0c;所以参考这个教程一般不会有错。 1、下载安装包和插件 安装包hadoop-2.7.0.tar.gz 必要插件winutils-master 2、…

JAVA15个常见面试题

下面是一些常见的Java面试题及答案&#xff1a; Java中的值传递和引用传递有什么区别&#xff1f; Java中的参数传递方式都是值传递&#xff0c;但是对于引用类型的参数&#xff0c;传递的是对象的引用副本。 什么是Java中的面向对象编程&#xff1f; 面向对象编程是一种编程范…

【产品设计】微信小程序如何做好“授权”设计?

授权登录降低了用户注册账号时的操作成本&#xff0c;减少了产品的获客门槛。在本文中&#xff0c;作者结合案例&#xff0c;盘点了微信小程序授权登录设计中需要注意的几点问题&#xff0c;并对功能设计背后的设计思路与原理进行了简要的分析 01 openID 这是微信生态圈中&…

# Linux下用mailx发送邮件,邮件内容在用户端变成了以为.bin为扩展名的邮件附件的问题解决

Linux下用mailx发送邮件&#xff0c;邮件内容在用户端变成了以为.bin为扩展名的邮件附件的问题解决 文章目录 Linux下用mailx发送邮件&#xff0c;邮件内容在用户端变成了以为.bin为扩展名的邮件附件的问题解决1 发送邮件范例&#xff1a;2 文件范例参考&#xff08;/root/loll…