前端开发(HTML,CSS,VUE,JS)从入门到精通!第七天(Vue)(二)
八、Vue 样式绑定
1.class 和 style 都是 HTML 元素的属性,用于设置元素的样式,我们可以使用 v-bind 来设置样式属性,v-bind 在处理 class 和 style 时,进行了增强,表达式除了可以使用字符串之外,还可以使用对象和数组。
(1)v-bind:class 设置一个 Vue 属性,从而可以动态的切换 class
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo22</title>
<script src="js/vue.min.js"></script>
<style>
.cls{
width: 200px;
height: 200px;
background-color: blue;
}
</style>
</head>
<body>
<div id="vm">
<!--通过选中或不选中 checkbox,来动态的给 div 添加 .cls 类样式-->
<label for="c1">修改颜色:</label>
<!--v-model 进行双向数据绑定,选中 checkbox 的时候,绑定的 use 值为 true,不选中时 use 的值为 false,这样双向数据绑定之后,
input的变化就会引起 Vue 属性 use 的变化,反过来也是一样的,属性的变化也会引起 input 的变化-->
<input type="checkbox" v-model="use" id="c1">
<!--如果 use 为 true,则动态给 div 添加 .cls 类,为 false,则不添加-->
<div :class="{'cls':use}"></div>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
use: false
}
})
</script>
</body>
</html>
当然,我们也可以一次性添加多个属性来动态切换 class,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo22</title>
<script src="js/vue.min.js"></script>
<style>
.active{
width: 200px;
height: 200px;
background-color: blue;
}
.text-waring{
color: red;
}
</style>
</head>
<body>
<div id="vm">
<!--v-model 进行双向数据绑定,选中 checkbox 的时候,绑定的 use 值为 true,不选中时 use 的值为 false,这样双向数据绑定之后,
input的变化就会引起 Vue 属性 use 的变化,反过来也是一样的,属性的变化也会引起 input 的变化-->
<input type="checkbox" v-model="flag1">点我
<input type="checkbox" v-model="flag2">点我
<!--如果 use 为 true,则动态给 div 添加 .cls 类,为 false,则不添加-->
<div :class="{'active':flag1,'text-waring':flag2}">我是 DIV</div>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
flag1: false,
flag2: false
}
})
</script>
</body>
</html>
我们还可以绑定一个对象,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo24</title>
<script src="js/vue.min.js"></script>
<style>
.active{
width: 200px;
height: 200px;
background-color: blue;
}
.text-waring{
color: red;
}
</style>
</head>
<body>
<div id="vm">
<!--如果 use 为 true,则动态给 div 添加 .cls 类,为 false,则不添加-->
<div :class="classObject">我是 DIV</div>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
classObject:{
'active': true,
'text-waring': true
}
}
})
</script>
</body>
</html>
我们还可以把一个数组传给 v-bind:class,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo25</title>
<script src="js/vue.min.js"></script>
<style>
.active{
width: 200px;
height: 200px;
background-color: blue;
}
.text-waring{
color: red;
}
</style>
</head>
<body>
<div id="vm">
<!--如果 use 为 true,则动态给 div 添加 .cls 类,为 false,则不添加-->
<div :class="[activeClass,waringClass]">我是 DIV</div>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
activeClass:'active',
waringClass:'text-waring'
}
})
</script>
</body>
</html>
(2)我们还可以使用 v-bind:style 直接设置样式
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo26</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<!--动态绑定 style 样式,此时的样式名和 DOM 中的样式名一致:即一个单词全部小写,两个单词以上第一个单词首字母小写,第二个单词首字母大写-->
<div :style="{color:textColor,fontSize:fontSize}">我是 DIV</div>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
textColor:'blue',
fontSize:'30px'
}
})
</script>
</body>
</html>
我们还可以将样式直接绑定一个对象,让模板更清晰,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo27</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<!--直接绑定一个对象-->
<div :style="styleObject">我是 DIV</div>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
/*
动态绑定 style 样式,此时的样式名和 DOM 中的样式名一致:即一个单词全部小写,两个单词以上第一个单词首字母小写,
第二个单词首字母大写
*/
styleObject:{
color:'#fff',
fontSize:'30px',
width:'200px',
height:'200px',
backgroundColor:'blue'
}
}
})
</script>
</body>
</html>
当然,我们也可以使用数组将多个样式应用在一个元素上,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo27</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<!--直接绑定一个对象-->
<div :style="[styleObject1,styleObject2]">我是 DIV</div>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
/*
动态绑定 style 样式,此时的样式名和 DOM 中的样式名一致:即一个单词全部小写,两个单词以上第一个单词首字母小写,
第二个单词首字母大写
*/
styleObject1:{
color:'#fff',
fontSize:'30px',
width:'200px',
height:'200px',
backgroundColor:'blue'
},
styleObject2:{
border:'2px solid #ccc',
borderRadius:'20px' //驼峰命名法,对应 border-radius
}
}
})
</script>
</body>
</html>
九、事件处理
1.Vue 的事件处理通过 v-on 指令来监听事件
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo29</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<div style="width: 200px;height: 200px;border: 1px solid #ccc;" @click="show"></div>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
name: 'Vue'
},
methods: {
show: function (e) {//这里的参数 e 和 DOM 事件中的事件对象(Event)一致
console.log("您好" + this.name);//this 指的是当前的 Vue 对象,this.name 指上面定义的 Vue 的属性
console.log(e.clientX + ":" + e.clientY);
}
}
});
</script>
</body>
</html>
除了直接绑定一个方法之外,还可以使用内联的 JavaScript 语句:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo29</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<button @click="show('您好')">点我</button>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
name: 'Vue'
},
methods: {
show: function (msg) {//事件函数
alert(msg);
}
}
});
</script>
</body>
</html>
2.事件的修饰符
(1)v-on 提供了事件修饰符来处理 DOM 事件的细节,比如 event.preventDefault() 或event.stopPropagation(),在 Vue 中都可以使用事件修饰符来完成,Vue 通过”.”操作符指定事件修饰符来完成事件的修饰,事件修饰符有:
① .stop:阻止冒泡
② .prevent:阻止事件的默认行为
③ .capture:阻止捕获
④ .self:只监听触发该元素的事件
⑤ .once:只触发一次
⑥ .left:鼠标左键事件
⑦ .right:鼠标右键事件
⑧ .middle:鼠标中间滚轮事件
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo31</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<div class="p" style="width: 300px;height: 300px;background-color: blue;" @click="show1">
<div class="s" style="width: 200px;height: 200px;background-color: red;" @click="show2">
<div class="ss" style="width: 100px;height: 100px;background-color: yellow;" @click.stop="show3">
</div>
</div>
</div>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
name: 'Vue'
},
methods: {
show1: function () {//事件函数
console.log("父元素被点击");
},
show2: function () {//事件函数
console.log("子元素被点击");
},
show3: function () {//事件函数
console.log("孙子元素被点击");
}
}
});
</script>
</body>
</html>
示例2:
<form @submit.prevent=”submit”>:阻止表单提交
<a @click.stop.prevent=”doThis”>:事件修饰符串联,阻止冒泡并阻止默认行为
<form v-on:submit.prevent>:只有修饰符
<div v-on:click.capture=”doThis”>:阻止捕获
<div v-on:click.self=”doThat”>:在当前元素本身(而不是子元素)触发时触发
<a v-on:click.once=”doThis”>:只触发一次
2.按键修饰符
(1)可以给按键事件添加修饰符,例如:<input v-on:keyup.13="submit">:当按键值是 13 的时候调用 submit方法,记住按键的 keyCode 比较困难,Vue 提供了常用的按键的别名:
① .enter:回车键
② .tab:制表符键
③ .delete:包含 del 键和 backspace 键
④ .esc:ESC键
⑤ .space:空格键
⑥ .up:向上键
⑦ .down:向下键
⑧ .left:向左键
⑨ .right:向右键
⑩ .ctrl:Ctrl键
⑪ .alt:Alt键
⑫ .shift:Shift键
⑬ .meta:Meta键
例如:<input @keyup.enter=”submit”>:当回车键松开的时候触发事件函数submit。
十、表单
1.Vue 的表单可以使用 v-model 指令在表单元素上进行双向数据绑定
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo11</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<!--当 v-model 指定的元素的值发生变化的时候,会引起 Vue 实例的 msg 属性值同步变化,反过来,通过 Vue 实例改变 msg 属性值的时候,
v-model 中的 msg 也会同步变化,这个会引起 input 的 value 进行更新,同时,表达式 {{msg}} 的值也会同步变化,我们将这个
过程称为双向数据绑定(MVVM)-->
ViewModel/VM:<input type="text" v-model="msg"> <br>
View/V:视图:{{msg}}
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
msg: ""//Model/M:数据
}
});
</script>
</body>
</html>
(1) 对于复选框,如果是一个复选框,则绑定一个逻辑值(true或false),如果是多个复选框,则绑定到一个数组,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo10</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<h3>单个复选框</h3>
<input type="checkbox" v-model="checked"> 单个复选框 <br>
<p>单个复选框:{{checked}}</p>
<hr>
<h3>多个复选框</h3>
<input type="checkbox" value="Baidu" v-model="names"> 百度
<input type="checkbox" value="Google" v-model="names"> 谷歌
<input type="checkbox" value="Huwwei" v-model="names"> 华为
<p>多个复选框:{{names}}</p>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
checked: false, //单个复选框绑定的是一个逻辑值
names: [] //多个复选框需要绑定到一个数组
}
});
</script>
</body>
</html>
(2) select 列表的双向数据绑定:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo33</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<select name="sites" id="sites" v-model="site">
<option value="www.baidu.com">百度</option>
<option value="www.google.com">谷歌</option>
<option value="www.huawei.com">华为</option>
</select>
<br>
<p>您的选择是:{{site}}</p>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
site:'www.huawei.com'
}
});
</script>
</body>
</html>
绑定是 option 的 value 值。
(3) 单选按钮双向数据绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo33</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<input type="radio" value="boy" v-model="sex"> 男
<input type="radio" value="girl" v-model="sex"> 女
<br>
<p>您的选择是:{{sex}}</p>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {//data 用于定义 Vue 对象(vm)的属性,由于 Vue 属于响应式框架,一旦这里的属性发生变化,界面上面的 Vue 的表达式页面跟着变
sex:''
}
});
</script>
</body>
</html>
radio 也是绑定的 value 值。
2.表单元素的修饰符
(1).lazy:默认情况下,v-model 绑定的表单元素会在 input 事件中同步输入框的值与属性数据,但是可以加上修饰符 .lazy,从而转为 change 事件(当表单元素失去焦点的时候才同步)。
<input type="text" v-model.lazy="msg"> <br>
(2).trim:自动过滤掉用户输入的首尾的空格,例如:
<input type="text" v-model.trim="msg"> <br>
(3).number:自动转换为数字
<input type="text" v-model.number="msg"> <br>
十一、Vue 的组件
1.组件(component)是 Vue 强大功能之一,组件可以扩展HTML 元素,封装可用的代码,组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用界面都可以抽象成一颗组件树。
2.注册全局组件
(1)语法:
全局组件可以在任意多个 Vue 实例中使用
注册组件之后,就可以像使用普通的 HTML 标签一样使用组件,例如:
<tagName></tagName>
示例:创建一个全局组件,并使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo35</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="app">
<!--使用组件就像使用 HTML 标签一样,语法:<组件名></组件名>,全局的组件可以在任何一个 Vue 实例中使用-->
<usercomp></usercomp>
</div>
<div id="vm">
<!--使用组件就像使用 HTML 标签一样,语法:<组件名></组件名>,全局的组件可以在任何一个 Vue 实例中使用-->
<usercomp></usercomp>
</div>
<script>
/**
* 注册全局组件,第一个参数是组件的名称,第二个参数是选项,全局组件可以在任何一个 Vue 实例中使用
*/
Vue.component("usercomp",{
//template 表示组件的模板,也就是该组件要展示的 HTML 内容,注意,如果模板中包含多条 HTML 语句,需要使用 div 包裹起来
template: "<div><h1>自定义的全局组件</h1><p>一个段落</p></div>"
});
//调用 Vue 的构造函数,产生一个 Vue 对象 app
var app = new Vue({
//el 定义 Vue 的挂载点,挂载到 #app 上,那么整个 #app 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#app"
});
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm"
});
</script>
</body>
</html>
3.我们也可以定义局部组件,局部组件只能在当前的 Vue 实例中使用
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo36</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<!--使用组件就像使用 HTML 标签一样,语法:<组件名></组件名>-->
<localcomp></localcomp>
</div>
<script>
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
components: {//局部组件,仅限于当前 Vue 实例能使用,可以定义多个这样的局部组件
//局部组件名
"localcomp":{//选项
template:"<div><h1>我是一个局部组件</h1></div>"
}
}
});
</script>
</body>
</html>
4.父组件向子组件传值,可以通过组件 props 选项来处理,父组件的数据需要通过属性的方式把数据传递给子组件,子组件需要显式的使用 props 选项来声明属性
示例:将父组件的属性值动态的传给子组件,父组件的属性值发生变化时,子组件对应的属性值跟着变化
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo37</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="vm">
<input type="text" v-model="parentMsg">
<!--使用组件就像使用 HTML 标签一样,语法:<组件名></组件名>,全局的组件可以在任何一个 Vue 实例中使用-->
<!--父组件是通过属性的方式将值传给子组件,我们这里用了动态属性绑定,将 message 属性的值绑定到了父组件的属性 parentMsg,当
parentMsg 发生变化时,子组件的对应属性值message也会跟着变化-->
<usercomp :message="parentMsg"></usercomp>
</div>
<script>
/**
* 注册全局组件,第一个参数是组件的名称,第二个参数是选项,全局组件可以在任何一个 Vue 实例中使用
*/
Vue.component("usercomp",{
/**
* 子组件是通过 props 选项来接收父组件传递过来的属性值,这个属性名是写在一个数组里面,例如:["message"],可以
* 有多个这样的属性值,这个属性传到子组件之后就作为子组件 Vue 实例的属性,可以用表达式输出 {{message}}
*/
props:["message"],
//template 表示组件的模板,也就是该组件要展示的 HTML 内容,注意,如果模板中包含多条 HTML 语句,需要使用 div 包裹起来
template: "<div><h1>自定义的子组件</h1><p>父组件传过来的属性值:{{message}}</p></div>"
});
//调用 Vue 的构造函数,产生一个 Vue 对象 vm
var vm = new Vue({
//el 定义 Vue 的挂载点,挂载到 #vm 上,那么整个 #vm 包括其后辈元素都被 Vue 管理起来,就可以使用 Vue 了
el:"#vm",
data: {
parentMsg: ''
}
});
</script>
</body>
</html>
十二、补充 ES6 语法
1. ES6 模块
(1)export 命令
① 模块功能主要由两个命令构成:export 和 import,export 用于规定模块对外接口,import 命令用于输入其他模块提供的功能
② 一个模块就是一个独立的文件,该文件内部的所有变量,外部无法获取,如果你希望外部能够读取模块内部的某个变量,就必须使用 export 关键字输出该变量,如下:
//profile.js:
export var firstName=”Michael”;
export var lastName=”Jackson”;
export var year = 1958;
export 的写法,除了像上面这样,还有另外一种写法:
//profile.js:
var firstName=”Michael”;
var lastName=””Jackson”;
var year = 1958;
export{ firstName, lastName, year};
应该优先考虑这种写法,因为这样就可以在脚本的尾部,一眼就看清楚输出了哪些变量
③ export 除了可以输出变量之外,还可以输出函数或类
export function multiply(x,y){
return x*y;
}
通常情况下,export 输出的变量就是本来的名字,但是可以使用关键字as重命名
function v1(){...}
function v2(){...}
export {
v1 as streamV1,
v2 as streamV2
}
(2)import 命令
① 使用 export 命令定义了模块对外接口以后,其他 JS 文件就可以通过 import 命令加载这个模块
//main.js
import {firstName,lastName,year} from “./profile.js”;
function setName(ele){
ele.textContent = firstName+”.”+lastName;
}
② 如果想为输入的变量重新取一个名字,import 命令要使用 as 关键字,将输入的变量重命名
import {lastName as surName} from ‘./profile.js’;
③ import 命令输入的变量都是只读的,因为它本质是输入接口,也就是说,不允许在加载模块的脚本里面,修改接口:
import {a} from ‘./xxx.js’;
a = {};//错误
但是,如果a是一个对象,改写a的属性是可以的:
import {a} from ‘./xxx.js’;
a.foo = ‘hello’;
④ 模块的整体加载
除了指定加载某个输出,还可以使用整体加载,即用星号(*)指定一个对象,所有的输出值都加载在这个对象上。
//circle.js
export function area(r){
return Math.PI*r*r;
}
export function cirumference(r){
return 2*Math.PI*r;
}
现在加载这个模块
import {area,cirumference} from ‘./circle’;
console.log(‘圆面积:’+area(4));
console.log(‘圆周长:’+cirumference(4));
上面的写法是逐一加载的方法,整体加载的方法如下:
import * as circle from ‘./circle’;
console.log(‘圆面积:’+circle .area(4));
console.log(‘圆周长:’+circle .cirumference(4));
(3)export default 命令
① 从前面的例子我们可以看出,使用 import 命令的时候,用户需要知道加载的变量的名和函数名,否则无法加载,但是,由于我们希望快速上手,未必愿意阅读文档,去了解有哪些属性和方法,为了给用户提供方便,让他们不用阅读文档就能加载模块,就要用到 export default 命令,为模块指定默认输出。
//export-default.js
export default function(){
console.log(“foo”);
}
export default { //导出一个JSON对象
}
上面的代码是一个模块文件 export-default.js,它的默认输出是一个函数,其他模块在加载该模块的时候,import 命令可以为该匿名函数指定名称:
//import-default.js
import customName from ‘./export-default’;
customName();//调用函数,输出foo
② export default 命令除了可以用在匿名函数前,也可以用在非匿名函数前。