Vue基础教程

article/2025/10/9 6:19:47

title: Vue基础教程
date: 2022-01-26 21:09:30
tags: [前端框架,Vue]
categories: 前 端
cover:


Vue基础入门

基础知识:

  1. HTML+JavaScript+CSS
  2. Node环境和npm(依赖管理 )
  3. webpack(可选)

官方文档:

  1. 学习任何框架,最好的教程就是官方文档,但是官方文档往往是英文的,可能会劝退:( 建议提升英文:)
  2. 初学者更适合视频学习,等有一定能力便可以向文档进发,因为更加详细:)

DOM是什么?

Document Object Model,简称DOM,中文叫做“文档对象模型

粗略理解就是:

DOM提供了对文档的结构化表述。从HTML或者xml程序中,对其结构进行访问,以及修改文档的结构、样式和内容,也就是可以对文档结构实现读写功能。(web页面与其源码都被称作是文档)

DOM 的实现

要想实现将js代码中的数据呈现到HTML页面上用DOM实现:

要先获取document/DOM,再获取节点,然后再去操作这个DOM节点(也就是在HTML中进行一系列的操作)。而使用Vue可以直接在html程序中绑定数据,当我们改变js中的数据时,就可以直接在页面上呈现出来

Vue相比于DOM的优点

要想实现将js代码中的数据呈现到HTML页面上,采用Vue可以让这个过程简化许多。

先创建Vue实例:

//创建VUE实例
new Vue({el:"#app",	//选择器data:{message:"我喜欢你"
}
})

然后将此实例和HTML中的

绑定到一起

<div id="app"><h1>{{meaasge}}</h1>	<!-- 双花括号是表达式的意思 -->
</div>

所以,以后我们要在HTML里面用js的数据,就直接写相应的数据名称就可以了,让数据和页面形成一个绑定,我们只要操作数据,页面自己就会跟着变化。

入门知识点

  1. 文本:双花括号

  2. 属性:v-bind:

    可省略,只写冒号:

  3. 事件:v-on:

    可省略,只写@

    注:如果要在函数里面使用Vue中的数据,可以使用this来访问

举例:

<div id="app"><h1>message</h1><img v-bind:src="url"></img>	<img :src="url"></img>	<button v-on:click=""></button><button @click=""></button>
</div><script>
new Vue({el:"#app",	<!-- el为元素选择器的意思-->data:{message="我喜欢你",url="inmages/1.jpg"},methods:{sayLoveYou(){alert("Love you!")}//Vue里的函数集合:methods,包含多个函数//数据集合:data,包含多个变量数据}
})
</script>

小练习:做一个翻页按钮

<body><div id="app"><button @click="sub">-</button><span>{{ number }}</span><button @click="add">+</button></div><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><script>new Vue({el:"#app",data:{number:0,},methods: {add(){this.number=this.number+1;},sub(){if(this.number==0){alert("不可以小于零")}elsethis.number--}}})</script>
</body>
</html>

效果:

创建Vue项目

配置开发环境

使用Node.js环境开发,

  1. cmd安装vue/cli
  2. 创建项目hello,建议在对应的目录下创建
  3. 启动服务器
命令:
npm install -g @vue/cli
vue create hello
cd hello
npm run serve

组件化开发概述

什么是组件化呢?

就是我们在html中进经常要用到标签,但是总有我们需要的标签HTML提供不了,所以,组件化开发就是,我们开发的.vue文件(又叫vue组件)作为html中的标签来使用。

例如我们可以开发.vue登录组件或者.vue轮播图组件然后插入到HTML中

优点:简洁与复用

项目结构概述

请添加图片描述

  1. 后缀.vue是我们上文中提到的组件,
  2. main.js是主文件,用于对应id与对应的组件(App.vue)
  3. components意为组件,一般我们自己开发的,也就是自定义的组件就放在这个目录下

剩余的一些为配置文件,

在这个vue中,我们可以写html、JavaScript、CSS代码,分别对应的是、、

例如:

<template>
<!-- html代码 --><div id="app"><h1>I lOVE You</h1><img alt="Vue logo" src="./assets/friend_404.gif"><h1>{{message}}</h1></div>
</template><script>
// js代码、vue代码
export default {  //首先,VUE中的js一定要用export来暴露自己
//其次在以vue为后缀的文件中vue表达数据的书写方式跟在以html为后缀的文件中vue的写法不一样data(){return{message: "Hello world",}}}
</script><style>
/* css代码 */
</style>

引入vue.js文件与Node环境下书写格式的区别

  1. 引入vue.js:

    data:{message:"我喜欢你!"
    }
    
  2. Node环境下:

      data(){return{message: "Hello world",}
    }
    

模板语法

指令

v-开头的

在这里插入图片描述

条件判断类:

  1. v-if
  2. v-show

v-if与v-show的异同点:

  • 同:

    都可以隐藏或者显示元素(true:显示、false:不显示)

  • 异:

    if不渲染DOM,如果if为false,在浏览器中不显示

    show渲染DOM,如果show都为false,在浏览器中将元素设置为display:one

显示列表与制表类:

v-for

这个for啊,极有可能是遍历,循环的意思

利用v-for指令显示列表
<template>
<!-- html代码 --><div id="app"> <ul><li v-for="(fruit,index) of fruits" :key="index"><p>水果名称:{{fruit}}</p> <p>水果序号:{{index}}</p> <p>水果名称和序号:{{fruit}}序号为{{index}}</p></li></ul></div>
</template><script>
// js代码、vue代码
export default {  //首先,VUE中的js一定要用export来暴露自己
//其次在vue中的js代码中的书写方式跟在html中的vue的写法不一样data(){return{fruits:["苹果","芒果","香蕉","原梦"]}}
}
</script>

显示结果:

请添加图片描述

可以看出就像是一个遍历呢,

一长串如何记住呢?

v-for="(fruit,index) of fruits" :key="index"元素索引属于集合,key的值为索引,然后将这个元素放在{{}}中
利用v-for制表
<template>
<!-- html代码 --><div><table><!-- 将studens显示在表格里 --><thead><th>序号</th><th>姓名</th><th>年龄</th></thead><tbody><!-- <tr>{{v.n}}</tr> --><tr v-for="(v,i) of students" :key="i"><td>{{i + 1}}</td><td>{{v.name }}</td><td>{{v.age}}</td></tr><!-- <tr v-for="(v,i) of students" :key="i">{{v.age}}</tr> --></tbody></table></div>
</template><script>
// js代码、vue代码export default {  //首先,VUE中的js一定要用export来暴露自己//其次在vue中的js代码中的书写方式跟在html中的vue的写法不一样components:{Hello,MenuList},data(){return{students:[{name:"张三 ",age:13},{name:"罗翔 ",age:12},{name:"John ",age:18}]}}}
</script><style>
/* css代码 */
</style>

演示效果:

组件嵌套

组件A想要用组件B 的功能,然后需要把组件B嵌套在A中。

三步走:命名、注册、传值

组件命名

B组件命名要首字母大写(小写可能会很HTML标签冲突,不建议这样写),大驼峰式,后缀.vue

注册组件

在B组件中暴露自己,在A组件中引入B组件

import B from "./components/B.vue";

在A中注册组件B,需要在A中写

components:{B:B
}

最后就是将B组价作为A组件的标签,放入A中:

<B>
</B>

组件传值

父子级的概念是,A组件如果包含B组件标签,则称A是B 的父级。

父级向子级传递数据

格式是属性传递(所以用双花括号来表达数据,用:来绑定标签)

首先需要在父级中单向引入子级

然后需要在子级中加入props属性

props是个字符串数组,里面的值为父级传过来的属性名

App.vue为父级
Child.vue为子级

<template>
<!-- html代码 --><div><h1>I lOVE You</h1><Child :msg="message"></Child><Child :mag="message1"></Child></div>
</template><script>import Child from "./components/Child.vue"
export default {components:{Child},data(){return{message:"这里是Vue的数据,我要传到Child组件中,也就是父传子",message1:"我是Vue的二号数据"}}}
</script><style>
/* css代码 */
</style>
<!--==============上面为App.vue=================下面为Child.vue====================--><template>
<div><h1>{{msg}} {{mag}}</h1></div>
</template><script>
export default {props: ["msg","mag"],   //props是一个数组的字符串,值为传过来的属性名msgdata(){return{}}
}
</script>

效果图:

在这里插入图片描述

子级向父级传递数据

格式是事件传递(@来绑定标签)

比如说我现在想写一个功能,一个子级的按钮button,点击它的时候,把子级的数据传递给父级,然后父级的数据变成子级的一个数据。

先在父级中定义一个自定义事件,然后在子级定义一个按钮,然后绑定点击按钮(@click)发生的方法,在子级中定义这个方法,然后在这个方法中调用方法

this.$emit("toParent", this.msg);

其中

//$emit方法可以触发父级(App.vue)的自定义事件,也就是进行了绑定,向自定义事件toParent传递数据 
//$emit方法需要两个参数,1、要绑定的父级中的自定义事件,2、所要传递是数据
//可以这样理解,因为我在App中的Child标签中自定义了事件toParent
//然后我又在Child中的调用了方法this.$emit,所以App就通过Chlid联系起来了

然后,分别在子级,父级中定义变量,用来存放数据(一般都充当容器的作用),子级的变量用来存放要给父级传递的数据,父级的变量用来接收子级传来的数据。

<template><div><div>我是父组件</div><div>我即将接收第二组件传值是:{{child2Msg}}</div><div><div><Child @toParent="getMag" /></div></div></div>
</template><script>
import Child from "./components/Child.vue";export default {components: {Child},data() {return {child2Msg: ""};},methods: {getMag(msg) {this.child2Msg = msg;}}
};
</script><!--==============上面为App.vue=================下面为Child.vue====================--><template><div><div>我是第二个子组件</div><div>我要发送给父组件的值:{{msg}}</div><button @click="toParent">向父组件发送信息</button></div>
</template><script>
export default {data() {return {msg: "我是第二组件,我要给父组件传值",};},methods: {toParent() {this.$emit("toParent", this.msg);}}
};
</script>

效果图:

点击前

在这里插入图片描述

点击后

在这里插入图片描述

一个父传子,子传父的综合例子:

  1. 分析过程:

    首先我们创建三个组件App.vue、Carts.vue、Counter.vue,然后

  2. 代码:

    <template><div><Carts></Carts></div>
    </template><script>
    import Carts from "./components/Carts.vue"export default {components:{Carts},data(){return{msg:""}}
    }
    </script>
    <!--==============上面为App.vue=================下面为Carts.vue====================--><template><div><h1>购物车</h1><ul><li v-for="(v,i) of cars" :key="i">{{v.name}} 单价:{{v.price}} <Counter :qu="v.qu":index="i"@sub="sub"@add="add"></Counter></li></ul></div>
    </template><script>
    import Counter from "./Counter.vue"
    export default {components:{Counter},data(){return{qu:0,cars:[{name:"兰博基尼",price:10000,qu:0},{name:"宝马",price:2000,qu:0},{name:"奔驰",price:4000,qu:0},{name:"特斯拉",price:5000,qu:0},]}},methods:{sub(index){if(this.cars[index].qu==0){alert("数量不可为0哦!")}else{this.cars[index].qu--;}},add(index){this.cars[index].qu++;}}
    }
    </script><!--============================下面为Counter.vue===============================--><template><span><button @click="sub">-</button><span>{{qu}}</span><button @click="add">+</button></span>
    </template><script>
    export default {props:["qu","index"],data(){return{}},methods:{sub(){this.$emit("sub",this.index);},add(){this.$emit("add",this.index);}}
    }
    </script><style></style>
    

效果图:

在这里插入图片描述

总结:

非子级之间传递数据

需要定义一个.js文件,里面存放有两个子级文件都需要操作的全局数据与调用的方法,然后在两个子级文件中分别引入这个.js文件。需要注意的是,如何在两个子级文件中表示对js文件中数据与方法的使用。

<template><div><Brother></Brother><Sister></Sister></div>
</template><script>import Brother from "./components/Brother"
import Sister from "./components/Sister"export default {components:{Carts,Brother, Sister},data(){return{}}
};
</script>
<!--==============上面为App.vue===============下面为Brother.vue====================-->
<template>
<div><h1>brother <button @click="changeData">改变数据</button></h1><p>{{bro.message}}</p>
</div>
</template><script>
import store from "../store.js"export default{data(){return{bro:store.state}},methods:{changeData(){store.setStateMessage("brother data")}}
}
</script><style>
</style>
<!--============================下面为Sister.vue===============================-->
<template>
<div>
<h1>sister</h1>
<p>{{sis.message}}</p>
</div>
</template><script>
import store from "../store.js"export default{data(){return{sis:store.state}}}
</script><style>
</style>
<!--============================下面为store.js===============================-->
export default {state:{message:"Hello Vue"},setStateMessage(str){this.state.message = str;}
} 

在Brother中定义变量bro,然后将js文件中的数据赋值给它,使用时使用bro.message,因为在store.js中已经定义了message,Sister中同理。

在Brother中调用store.js的setStateMessage方法的调用格式为:store.setStateMessage()

计算属性与监听器

计算属性:computed

计算属性要解决的问题就是:

我有一个非常复杂的计算表达式,直接将这个表达式放在标签里显得很乱,很复杂。我们为了简洁好看,将这个表达式用花括号{}包装起来,然后给它起个名字,加个参数,它就变成了一个方法了,然后把这个方法放在computed:{ }里面,然后在标签里面如何调用这个非常复杂的计算表达式呢?那就是在双花括号里面写入方法的名字{{方法名}}。

下面这个例子计算:总价=单价×数量×折扣

<template>
<div id="app"><h1>{{message}}</h1><p>单价{{price}}</p><p>数量<button @click="sub">-</button><span>{{quatity}}</span><button @click="add">+</button></p><p>	折扣 {{discount}}</p><h2>总价:{{totalPrice}}</h2>
</div>
</template><script>
export default{data(){return{message:"Hello world",price:99,quatity:0,discount:0.5}},computed:{totalPrice(){return this.price*this.quatity*this.discount}},methods:{sub(){this.quatity--},add(){this.quatity++}}
}
</script><style></style>

监听器:watch

监听器就是监听一个值,然后把这个值变化之后的值传到一个方法里面,方法的名字就是这个值的名字,方法的内容往往是对这个值变化之后的值进行一系列的计算。

例如:监听器要监听value的值,然后就把val变化之后的值传到value(val){ },其中val是value变化后的值。

<template>
<div id="app"><h1>{{message}}</h1><p>单价{{price}}</p><p>数量<button @click="sub">-</button><span>{{quatity}}</span><button @click="add">+</button></p><p>	折扣 {{discount}}</p><h2>总价:{{totalPrice}}</h2>
</div>
</template><script>
export default{data(){return{message:"Hello world",price:99,quatity:0,discount:0.5,totalPrice:0}},// computed:{// 	totalPrice(){// 		return this.price*this.quatity*this.discount// 	}// },watch:{quatity(qu){this.totalPrice = this.price * qu * this.discount}},methods:{sub(){this.quatity--},add(){this.quatity++}}
}
</script><style></style>

计算属性与监听器的区别

多个值改变,为了得到一个值的结果,一般用计算属性(computed)

一个值的改变,会引起多个值的改变,一般用监听器(watch)

实际开发中,大部分时候用computed属性,性能也比较好

但是在用到路由的时候,只能用监听器。


http://chatgpt.dhexx.cn/article/CZSJk0m0.shtml

相关文章

尚硅谷Vue2.0+Vue3.0全套教程视频笔记 + 代码 [P101-135]

视频链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通_哔哩哔哩_bilibili P1-50&#xff1a;尚硅谷Vue2.0Vue3.0全套教程视频笔记 代码 [P001-050]_小白桶子的博客-CSDN博客 P51-100&#xff1a;尚硅谷Vue2.0Vue3.0全套教程视频笔记 代码 [P051-100]_小白桶子…

Vue 视频音频播放

<hlsPlayer :rowData"rowData" ref"child" /> <videoPlayer :rowData"rowData" ref"childTwo" /> 1.安装video.js依赖 npm install --save video.js 2.全局引入 import Video from video.js import video.js/dist/vide…

vue3 vue2 视频 图片 懒加载插件

一个npm的小插件&#xff0c;只有8kb左右的轻量级插件 可以设置图片和视频加载时的占位图&#xff0c;图片加载错误占位图&#xff0c;规定加载的区域 vue3的话具体可以看文档v3-lazyload-hyw - npm (npmjs.com) vue2的话文档在这里 v2-lazyload-hyw - npm (npmjs.com) 安装…

Vue3视频播放器组件Vue3-video-play入门教程

Vue3-video-play适用于 Vue3 的 hls.js 播放器组件 | 并且支持MP4/WebM/Ogg格式。 1、支持快捷键操作 2、支持倍速播放设置 3、支持镜像画面设置 4、支持关灯模式设置 5、支持画中画模式播放 6、支持全屏/网页全屏播放 7、支持从固定时间开始播放 8、支持移动端&#xff0c;移动…

Vue3全套教程合集

Vue3全套教程合集 点击跳转具体教程&#xff0c;以下所有教程基于脚手架书写&#xff0c;运行代码需要在脚手架环境。 一、Vue3学习-初识Vue3、创建Vue3.0工程 二、Vue3学习-分析工程结构、初识setup 三、Vue3学习-ref函数、reactive函数、Vue3响应式原理 四、Vue3学习-Vue3的…

vue怎么设置封面_vue设置视频封面教程 vue如何修改标题

现在使用vue的伙伴很多&#xff0c;可以说是视频编辑美化软件排前几的软件&#xff0c;能够使用的功能非常多&#xff0c;有用户就想知道如何才能进行标题的修改&#xff0c;视频的封面又是怎么设置的&#xff0c;想知道的伙伴&#xff0c;可以在iefans看看详细的操作方法哦&am…

vue视频教程,vue2.0

vue视频教程很多人对我说vue教程&#xff0c;这里我给大家推荐vue2.0视频教程下载&#xff0c;这是一套从基础到项目一共8天的就业视频从0基础到商城实战有基础可以跳过直接项目 可以关注微信公众号搜索&#xff1a;cityapes或者搜索:城市一猿 点击菜单的vue.js就可以下载了

vue教程

原文 1 vue安装 1.1 直接用 script标签引入 对于制作原型或学习&#xff0c;你可以这样使用最新版本&#xff1a; <script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>对于生产环境&#xff0c;我们推荐链接到一个明确的版本号和构…

vue视频教程大全下载

vue视频12套完整教程大全下载&#xff0c;新手开发必备包含项目实战等多套视频教程 可以扫描二维码关注微信公众号 或者搜索&#xff1a;cityapes或者搜索:城市一猿 点击菜单的vue.js就可以下载了

Vue基础视频教程(一)

1、github上的网址&#xff1a;https://github.com/vuejs/vue 2、Vue中文文档&#xff1a;https://cn.vuejs.org/v2/guide/installation.html 3、CDN&#xff1a;http://www.bootcdn.cn/ 4、看哥们儿&#xff0c;分享给我的视频--> 基础实验代码&#xff1a; <!DOCT…

vue初级视频教程

1.观看本视频之前 官方指南假设你已了解关于 HTML、CSS 和 JavaScript 的中级知识。如果你刚开始学习前端开发&#xff0c;将框架作为你的第一步可能不是最好的主意——掌握好基础知识再来吧&#xff01;之前有其它框架的使用经验会有帮助&#xff0c;但这不是必需的。 2.Vue…

【第一季】Vue2.0视频教程-内部指令(共8集)

【第一季】Vue2.0视频教程-内部指令(共8集) 【第一季】Vue2.0视频教程-内部指令(共8集)第1节&#xff1a;走起我的Vue2.0 学习这套课程你需要的前置知识&#xff1a;下载Vue2.0的两个版本&#xff1a;项目结构搭建live-server使用编写第一个HelloWorld代码&#xff1a; 第2节&a…

vue.js2.0完整视频教程12套

0.1智能社vuejs(1-11章全套) 0.2英文版learing vuejs 0.3Vue.js实战小米阅读开发 0.4走进Vue.js2.0 0.5Vuejs教程45节课 0.6Vue.jsNode.js构建音乐播放器 0.7js高级课程vuejs 0.8vue.js实战开发系列 0.9Vue视频教程基础视频教程 10.vue.js实战wm平台 等...就不一一列…

万字入门推荐系统

来源&#xff1a;毛小伟 本文约8000字&#xff0c;建议阅读10分钟 本文作者整理出了这份万字入门推荐系统&#xff0c;涵盖了推荐系统基础、进阶、实战的全部知识点&#xff0c; 最近一周作者跟朋友三人&#xff0c;根据自身如何入门推荐系统&#xff0c;再结合三人分别在腾讯…

构建自己的Android知识体系

0. 背景 构建一个属于自己的知识体系,能够让我们学到的知识体系化.让自己清楚哪块是自己的知识盲区,哪块已经构建起根基.然后根据实际情况,有针对性的进行模块学习.让自己成为一个合格的Android工程师. 平时看博客或者学知识,学到的东西比较零散,没有独立的知识模块概念,而且…

公司用的 MySQL 团队开发规范,太详细了,建议收藏!

点击上方“Java精选”&#xff0c;选择“设为星标” 别问别人为什么&#xff0c;多问自己凭什么&#xff01; 下方留言必回&#xff0c;有问必答&#xff01; 每天 08:35 更新文章&#xff0c;每天进步一点点... 数据库对象命名规范 数据库对象 数据库对象是数据库的组成部分&a…

电影信息爬取与聚类分析

电影信息爬取与聚类分析 要求&#xff1a;爬取电影相关数据&#xff0c;条数不小于1000&#xff0c;结构自定&#xff0c;要求包含情感信息&#xff0c;类别&#xff0c;评论关键词等&#xff0c;然后基于这些信息根据用户的喜好做相关性聚类。 一、总体设计 &#xff08;1&…

算法推导 | 卷积神经网络(CNN)反向传播

作者丨南柯一梦宁沉沦知乎 编辑丨极市平台 来源丨https://zhuanlan.zhihu.com/p/61898234 多层感知机反向传播的数学推导&#xff0c;主要是用数学公式来进行表示的&#xff0c;在全连接神经网络中&#xff0c;它们并不复杂&#xff0c;即使是纯数学公式也比较好理解。而卷积神…

深入浅出学习Hive

本文是基于CentOS 7.9系统环境&#xff0c;进行hive的学习和使用 一、Hive的简介 1.1 Hive基本概念 (1) 什么是hive Hive是用于解决海量结构化日志的数据统计工具&#xff0c;是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供…

你知道豆瓣电影是怎么评分的吗?(实战篇—手把手教你分析豆瓣电影)

点赞再看&#xff0c;养成好习惯 Python版本3.8.0&#xff0c;开发工具&#xff1a;Pycharm 写在前面的话&#xff1a; 如果你是因为看到标题进来的&#xff0c;那恭喜你&#xff0c;又多了一个涨&#xff08;入&#xff09;知&#xff08;坑&#xff09;识的机会。 在这篇豆…