VSCode
VSCode 安装教程(超详细)
Node.js
使前端开发发生改变,Node.js
可以做服务器程序, node index.js
启动服务。会自动安装 npm。
npm
npm
(Node Package Manager) 是 Node.js 的包管理工具,用来安装各种 Node.js 的扩展。 npm 是 JavaScript 的包管理工具,也是世界上最大的软件注册表。相当于后端开发的 maven。
npm常见指令:
//生成package.json,相当于pom.xml
# npm init
# npm init --yes
//全局安装
# npm install 模块名 -g
//本地
# npm install 模块名
//安装依赖,并且记录在package.json
# npm install 模块名 --save
//卸载
# npm uninstall 模块名
//查看当前安装模块
# npm ls
//安装 cnpm 工具,指定国内 npm 镜像源
# npm install -g cnpm --registry=https://registry.npm.taobao.org
//cnpm 安装
# cnpm install 模块名
//安装 yarn 工具,指定国内npm镜像源
# npm install -g yarn --registry=https://registry.npm.taobao.org
示例:
# cnpm install express --save
安装express
框架,相当于springMvc
,查看 package.json
以及 node_modules
(各种依赖包)。
Vue
是一套构建用户界面的渐进式框架
。
自底向上增量开发
的设计。响应的数据绑定和组合的视图组件
。Vue 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。
数据绑定最常见的形式就是使用 {{...}}
(双大括号)的文本插值
<body>
<div id="zhq">
<h1>{{title}}--{{ts}}h1>
div>
body>
<script>
var vm=new Vue({
el:'#zhq',
// 定义属性,并设置初始值
data:{
title:'Hello Vue',
ts:new Date().getTime()
}
});
script>
{{...}}
标签的内容将会被替代为对应组件实例中 title 属性的值,如果 title 属性的值发生了改变,{{...}}
标签内容也会更新。
如果不想改变标签的内容,可以通过使用 v-once
指令执行一次性地插值,当数据改变时,插值处的内容不会更新。
<h1 v-once>{{title}}--{{ts}}h1>
也可以使用 v-text
,但v-text
内容会覆盖该标签所有内容
<h1 v-text="'覆盖所有数据'">{{title}}--{{ts}}h1>
使用 v-html
指令用于输出 html 代码
<body>
<div id="zhq">
<p>使用双大括号的文本插值: {{ rawHtml }}p>
<p>使用 v-html 指令: <span v-html="rawHtml">span>p>
div>
body>
<script>
var vm=new Vue({
el:'#zhq',
// 定义属性,并设置初始值
data:{
rawHtml: '这里会显示红色!'
}
});
script>
HTML 属性中的值应使用 v-bind
指令。
<body>
<div id="app">
<img v-bind:src="imgSrc[num]" width="500" height="600">
div>
body>
<script>
var vm=new Vue({
el:'#app',
// 定义属性,并设置初始值
data:{
num:0,
imgSrc: ["./image/1.jpg","./image/2.jpg","./image/3.jpg","./image/4.jpg"]
}
});
script>
使用 v-bind
动态设置标签的 src 属性。通常情况,v-bind
可以省略,只需要 :
即可。
<img :src="imgSrc[num]" width="500" height="600">
对于布尔属性,常规值为 true 或 false,如果属性值为 null 或 undefined,则该属性不会显示出来。
<button v-bind:disabled="isButtonDisabled">按钮button>
上例,如果 isButtonDisabled 的值是 null 或 undefined,则 disabled 属性甚至不会被包含在渲染出来的
<div v-bind:class="{'class1': use}">
判断 use 的值,如果为 true 使用 class1 类的样式,否则不使用该类。
Vue 提供了完全的 JavaScript 表达式支持。
<body>
<div id="app">
{{5+5}}<br>
{{ ok ? 'YES' : 'NO' }}<br>
{{ message.split('').reverse().join('') }}
<div v-bind:id="'list-' + id">菜鸟教程div>
div>
body>
<script>
var vm=new Vue({
el:'#app',
data:{
ok: true,
message: 'RUNOOB!!',
id: 1
}
});
script>
表达式会在当前活动实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式,所以下面的例子都不会生效:
{{ var a = 1 }}
{{ if (ok) { return message } }}
Vue 指令是 Vue.js 的一项核心功能,它们可以在 HTML 模板中以 v- 开头
的特殊属性形式使用,用于将响应式数据绑定到 DOM 元素上或在 DOM 元素上进行一些操作。
指令 | 描述 |
---|---|
v-bind | 用于将 Vue 实例的数据绑定到 HTML 元素的属性上。 |
v-if(v-else) | 用于根据表达式的值来条件性地渲染元素或组件。 |
v-show | v-show 是 Vue.js 提供的一种指令,用于根据表达式的值来条件性地显示或隐藏元素。 |
v-for | 用于根据数组或对象的属性值来循环渲染元素或组件。 |
v-on | 用于在 HTML 元素上绑定事件监听器,使其能够触发 Vue 实例中的方法或函数。 |
v-model | 用于在表单控件和 Vue 实例的数据之间创建双向数据绑定。 |
使用 v-if
和 v-else
指令根据表达式的值来条件性地渲染元素或组件
<body>
<div id="app">
<p v-if="showMessage">Hello Vue!p>
<p v-else>Goodbye Vue!p>
div>
body>
<script>
var vm=new Vue({
el:'#app',
data:{
showMessage: true
}
});
script>
注: v-if
如果判断为 false,该标签直接不会加载。
还可以使用 v-else-if
进行多级判断
<body>
<div id="app">
<div v-if="type === 'A'">
A
div>
<div v-else-if="type === 'B'">
B
div>
<div v-else-if="type === 'C'">
C
div>
<div v-else>
Not A/B/C
div>
div>
body>
<script>
var vm=new Vue({
el:'#app',
data:{
type: "C"
}
});
script>
使用 v-show
指令根据表达式的值来条件性地渲染元素或组件
<body>
<div id="app">
<p v-show="showMessage">Hello Vue!p>
div>
body>
<script>
var vm=new Vue({
el:'#app',
data:{
showMessage: false
}
});
script>
注: v-show
如果判断为 false,会设置标签的样式 。
迭代数值
使用 v-for
指令根据数组的属性值循环渲染元素或组件
<body>
<div id="app">
<ul>
<li v-for="(item,index) in items" :key="item.id">
{{index}}:{{item.text }}
li>
ul>
div>
body>
<script>
var vm = new Vue({
el: '#app',
data: {
items: [
{ id: 1, text: 'Item 1' },
{ id: 2, text: 'Item 2' },
{ id: 3, text: 'Item 3' }
]
}
});
script>
迭代对象
<body>
<div id="app">
<ul>
<li v-for="(value, key, index) in object">
{{ index }}. {{ key }} : {{ value }}
li>
ul>
div>
body>
<script>
var vm = new Vue({
el: '#app',
data: {
object: {
name: '菜鸟教程',
url: 'http://www.runoob.com',
slogan: '学的不仅是技术,更是梦想!'
}
}
});
script>
显示过滤/排序后的结果
我们可以对数组的元素进行处理后再显示出来,一般可以通过创建一个计算属性,来返回过滤或排序后的数组。
<body>
<div id="app">
<ul>
<li v-for="n in evenNumbers">{{ n }}li>
ul>
div>
body>
<script>
var vm = new Vue({
el: '#app',
data: {
numbers: [1, 2, 3, 4, 5]
},
computed: {
evenNumbers() {
return this.numbers.filter(number => number % 2 === 0)
}
}
});
script>
v-for/v-if 联合使用
联合使用 v-for/v-if 给 select 设置默认值
<body>
<div id="app">
<select @change="changeVal($event)" v-model="selOption">
<template v-for="(site,index) in sites" :site="site" :index="index" :key="site.id">
<option v-if = "index == 0" :value="site.name" selected>{{site.name}}option>
<option v-else :value="site.name">{{site.name}}option>
template>
select>
<div>您选中了:{{selOption}}div>
div>
body>
<script>
var vm = new Vue({
el: '#app',
data: {
selOption: "Google",
sites: [
{ id: 1, name: "Google" },
{ id: 2, name: "Runoob" },
{ id: 3, name: "Taobao" },
]
},
methods: {
changeVal: function (event) {
this.selOption = event.target.value;
alert("你选中了" + this.selOption);
}
}
});
script>
v-for
循环出列表,v-if
设置选中值
引申:template标签
vue 开发的组件中,特别是 .vue 为后缀的文件,常常见到一个 ...
包裹的一段界面的代码。但你没有发现,当你发布后,查看源码,你会发现这个 template 标签不见了,这个就是 template 的核心功能。
template 并不是 vue 特有的标签,2013年各大浏览器就开始支持template了。
使用 template 的好处:就是当我们的组件被渲染到页面时,多次循环的时候,它里面的代码就可以多次使用。
<body>
<div id="app">
<ul>
<template v-for="(value, key, index) in object">
<li>
{{ index }}. {{ key }} : {{ value }}
li>
template>
ul>
div>
body>
<script>
var vm = new Vue({
el: '#app',
data: {
object: {
name: '菜鸟教程',
url: 'http://www.runoob.com',
slogan: '学的不仅是技术,更是梦想!'
}
}
});
script>
迭代对象的 template 写法。其实就是将
使用 v-on
指令在 HTML 元素上绑定事件监听器
<body>
<div id="app">
<button v-on:click="add">增加button>
<p>{{num}}p>
div>
body>
<script>
var vm=new Vue({
el:'#app',
data:{
num: 0
},
methods: {
add: function() {
this.num++;
}
}
});
script>
通常情况,v-on
可以省略,只需要 @
即可。
<button @click="add">增加button>
修饰符是以半角句号.
指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.enter
修饰符告诉 v-on
指令对于回车事件的输入。
<input type="text" v-model="city" @keyup.enter="search">
输入框点击回车键后,触发事件。
v-model
指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定
,根据表单上的值,自动更新绑定的元素的值。
<body>
<div id="app">
<input type="text" v-model="num" />
<button v-on:click="doIncrement()"> ++ button>
<p>{{num}}p>
div>
body>
<script>
var vm=new Vue({
el:'#app',
data:{
num: 0
},
methods: {
doIncrement: function() {
this.num++;
}
}
});
script>
点击按钮可以更改 num 的值,反过来,输入栏输入值也会更改 num 的值。
需求:
思路:
v-on
指定点击事件。v-bind
绑定数组。v-show
逻辑判断。DOCTYPE html>
<html>
<head>
<title>vuetitle>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
head>
<body>
<div id="app">
<button @click="leftClick" v-show="num>0"> 左 button>
<img :src="imgScr[num]">
<button @click="rightClick" v-show="num" > 右 button>
div>
body>
<script>
var vm = new Vue({
el: "#app",
data: {
imgScr: ["./image/1.jpeg","./image/2.jpg","./image/3.jpg","./image/4.jpeg"],
num: 0
},
methods: {
leftClick: function() {
this.num--;
},
rightClick: function() {
this.num++;
}
}
});
script>
html>
需求:
思路:
@keyup.enter
指定回车录入事件。v-show
逻辑判断。DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>title>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js">script>
head>
<body>
<div id="app">
<input type="text" v-model="content" @keyup.enter="luru">
<ul>
<li v-for="(item,index) in contentList">
{{index+1}}. {{item}} <button @click="del(index)"> 删除 button>
li>
ul>
<p v-show="contentList.length!=0">内容总数:{{contentList.length}}p> <button v-show="contentList.length!=0" @click="delAll()"> 清除所有 button>
div>
body>
<footer>
<div id="footer">
<p>内容总数:{{count}}p>
div>
footer>
<script>
var app = new Vue({
el:'#app',
data:function(){
return{
content: "",
contentList: []
}
},
// 定义方法,用于事件交互时使用的函数
methods: {
luru: function() {
this.contentList.push(this.content);
//更新其他 Vue实例属性值
footer.count++;
},
del: function(index) {
this.contentList.splice(index,1);
//更新其他 Vue实例属性值
footer.count--;
},
delAll: function() {
this.contentList = [];
//更新其他 Vue实例属性值
footer.count = 0;
}
}
});
var footer = new Vue({
el:'#footer',
data:function(){
return{
count: app.contentList.length
}
}
});
script>
html>