1.过滤器
定义:对要显示的数语法:
1.注册过滤器: Vue.filter(name,callback) 或 new Vue{filters:{}}
2.使用过滤器:{{xxx | 过滤器名}} 或 v-bind:属性 =“xxx过滤器名"
备注:
1.过滤器也可以接收额外参数、多个过滤器也可以串联
2.并没有改变原本的数据,是产生新的对应的数据据进行特定格式化后再显示(适用于一些简单逻辑的处理)
用过滤器实现格式化日期
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 过滤器:
定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)
语法:
1.注册过滤器: Vue.filter(name,callback) 或 new Vue{filters:{}}
2.使用过滤器:{{xxx | 过滤器名}} 或 v-bind:属性 =“xxx过滤器名"
备注:
1.过滤器也可以接收额外参数、多个过滤器也可以串联
2.并没有改变原本的数据,是产生新的对应的数据 -->
<div id='root'>
<h2>显示格式化后的时间</h2>
<!-- 计算属性实现 -->
<h3>现在是: {{fmtTime}}</h3>
<!-- methods实现 -->
<h3>现在是: {{getFmtTime()}}</h3>
<!-- 过滤器实现 -->
<h3>现在是: {{time|timeFormater}}</h3>
<!-- 过滤器实现 (传参) -->
<h3>现在是: {{time | timeFormater('YYYY_MM_DD') | mySlice}}</h3>
</div>
<div id="root2">
<h2>{{msg | mySlice}}</h2>
</div>
</body>
<script src="../vue.js"></script>
<script src="../dayjs.min.js"></script>
<script>
// 全局的过滤器
Vue.filter("mySlice", function (value) {
return value.slice(0,4)
});
new Vue({
el: "#root",
data: {
time: 1621561377603
},
computed: {
fmtTime() {
return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss');
}
},
methods: {
getFmtTime() {
return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss')
}
},
filters: {
timeFormater(value, str = 'YYYY年MM月DD日 HH:mm:ss') {
// console.log('@',value)
return dayjs(value).format(str)
},
// 局部过滤器
// mySlice(value){
// return value.slice(0,4)
// }
}
})
new Vue({
el: "#root2",
data: {
msg: "hellooo"
},
})
</script>
</html>
2.自定义指令
自定义指令总结:
一、定义语法:
(1)局部指令:
new Vue({
directives:{指令名:配置对象}
})
或
new Vue({
directves(){}
})
(2)全局指令:
Vue.directive(指令名,配置对象)或Vue.directive(指令名,回调函数)
二、配置对象中常用的3个回调:
(1)bind:指令与元素成功绑定时调用
(2)inserted:指令所在元素被插入页面时调用
(3)update:指令所在模板被重新时调用。
三、备注:
1.指令定义时不加v-,但使用时要加v-
2.指令名如果是多个单词,要使用Kebab-case命名方式,不要用camelCase命名
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="./image/logo.ico" type="image/x-icon">
<title></title>
<script src="./vue.js"></script>
<style>
</style>
</head>
<body>
<!--
需求1:定义一个v-big指令,和v-text功能类似,但是会把绑定的数据放大10倍
需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的元素自动获取焦点
-->
<div id="root">
<h1>{{str}}</h1>
<h2>当前的n值是:<span v-text="n"></span></h2>
<h2>放大10倍后的n值是:<span v-big="n">放大10倍后的n值是:</span></h2>
<button @click="n++">点我n+1</button>
<hr>
<input type="text" v-fbind:value="n">
</div>
<script>
const vm=new Vue({
el:'#root',
data:{
str:'时间啊,你是多么的美丽',
n:1
},
directives:{
// big函数何时会被调用?1.指令于元素成功绑定时(一上来)2.指令所在的模板被重新解析时
big(element,binding){
console.log('big被调用')
element.innerText=binding.value*10
},
fbind:{
// 指令于元素成功绑定时(一上来)
bind(element,binding){
element.value=binding.value
},
// 指令所在元素被插入页面时
inserted(element,binding){
element.focus()
},
// 指令所在的模板被重新解析时
update(element,binding){
element.value=binding.value
}
}
}
})
</script>
</body>
</html>
3.生命周期
声明周期:
1.又名生命周期回调函数,生命周期钩子
2.是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数
3.生命周期函数的名字不可更改,但函数的具体内容是程序员更加需求编写的。
4.生命周期函数中的this指向是vm或组件实例对象
VM的生命周期
将要创建====>调用beforeCreate函数
创建完毕====>调用created函数
将要挂载====>调用beforeMount函数
(重要)挂载完毕====>调用mounted函数
将要更新====>调用beforeUpdate函数
更新完毕====>调用updated函数
(重要)将要销毁====>调用beforeDestroy函数
销毁完毕====>调用destroyed函数
常用的生命周期钩子
1.mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等[初始化操作]
2.beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等[收尾工作]。
关工销毁Vue实例
1.销毁后借助Vue开发者工具看不到任何信息。
2.销毁后自定义事件会失效,但原生DOM事件依然有效。
3.一般不会再beforeDestroy操作数据,因为即便操作数据,也不会再他发更新流程了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="./image/logo.ico" type="image/x-icon">
<title></title>
<script src="../vue.js"></script>
<style>
</style>
</head>
<body>
<!-- 常用的生命周期钩子:
1.mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等[初始化操作]
2.beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等[收尾工作]。
关工销毁Vue实例
1.销毁后借助Vue开发者工具看不到任何信息。
2.销毁后自定义事件会失效,但原生DOM事件依然有效。
3.一般不会再beforeDestroy操作数据,因为即便操作数据,也不会再他发更新流程了。 -->
<div id="root">
<h1 :style="{opacity}">{{str}}</h1>
<button @click="stop">点我停止变换</button>
<button @click="opacity=1">点我透明度变为一</button>
</div>
<script>
const vm= new Vue({
el:'#root',
data:{
str:'时间啊,你是多么的美丽',
opacity:1,
},
mounted() {
this.timer= setInterval(()=>{
vm.opacity-=0.01
if(vm.opacity<=0) vm.opacity=1
},16)
},
methods: {
stop(){
this.$destroy()
}
},
beforeDestroy() {
console.log('vm即将被销毁')
clearInterval(this.timer)
},
})
</script>
</body>
</html>
4.vue组件
单文件组件
Vue中使用组件的三大步骤:
1.定义组件(创建组件)
2.注册组件
3.使用组件(写组件标签)
一、如何定义一个组件?
使用Vue.extend(options)创建,其中options和New Vue(option)时传入的那个option几乎一样,但也有点区别:
1.el不要写,为什么?最终所有组件都要经过一个vm的管理,由VM中的el决定服务哪个容器
2.data必须写出函数,为什么?——————避免组件被复用时,数据存在引用关系
备注:使用template可以配置组件结构
二、如何注册组件
1.局部注册:靠new Vue的时候传入components选项
2.全局注册:靠Vue.component('组件名',组件)
三、编写组件标签
<组件名><组件名/>
创建文件取名叫School.vue
<template>
<!-- 组件的结构 -->
<div class="demo">
<h2>学校名称:{{A}}</h2>
<h2>学校地址:{{address}}</h2>
<button @click="showName">点我提示学校名</button>
</div>
</template>
<script>
// 组件交互相关的代码(数据,方法等)
export default {
name:"School",
data(){
return{
A:'尚硅谷',
address:'上海',
}
},
methods: {
showName(){
alert(this.A)
}
},
}
</script>
<style scoped>
/* 组件的样式 */
.demo{
background-color: orange;
}
</style>
创建文件名叫Student.vue
<template>
<!-- 组件的结构 -->
<div class="demo">
<h2>学生姓名:{{name}}</h2>
<h2>学校年龄:{{age}}</h2>
</div>
</template>
<script>
// 组件交互相关的代码(数据,方法等)
export default {
name:"Student",
data(){
return{
name:'Tom',
age:18,
}
},
}
</script>
App.vue文件
<template>
<div>
<img src="./assets/logo.png" alt="logo">
<school></school>
<student></student>
</div>
</template>
<script>
// 引入组件
import School from './components/School.vue'
import Student from './components/Student'
export default {
name:'App',
components:{
School,
Student
}
}
</script>
非单文件组件
1.基本使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="./image/logo.ico" type="image/x-icon">
<title></title>
<script src="../vue.js"></script>
<style>
</style>
</head>
<body>
<!-- Vue中使用组件的三大步骤:
定义组件(创建组件)
注册组件
使用组件(写组件标签)
如何定义一个组件?
使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别:
区别如下:
1.e1不要写,为什么? 最终所有的组件都要经过一个vm的管理,由vm中的e1决定服务哪个容器。
2.data必须写成函数,为什么?
避免组件被复用时,数据存在引用关系。
备注:使用template可以配置组件结构。
、如何注册组件?
1.局部注册:
华new Vue的时候传入components选项
2.全局注册:
靠Vue.component(组件名 组件)
U英
、编写组件标签:
<school></schoo1> -->
<div id="root">
<h2>{{msg}}</h2>
<!-- 第三步:编写组件标签 -->
<school></school>
<hr>
<!-- 第三步:编写组件标签 -->
<student></student>
<student></student>
</div>
<div id="root2">
<hello></hello>
</div>
<script>
// 第一步:创建school组件
const school = Vue.extend({
// el:'#root',组件定义时,一定不要写el配置项,因为最终所有的组件都要被一个vm管理,由vm决定服务哪个容器
template: `
<div>
<h2>学校名称:{{schoolName}}</h2>
<h2>学校地址:{{address}}</h2>
<button @click="showName">点我提示学校名</button>
</div>
`,
data() {
return {
schoolName: '尚硅谷',
address: '上海',
}
},
methods: {
showName() {
alert(this.schoolName)
}
},
})
// 第一步:创建student组件
const student = Vue.extend({
template: `
<div>
<h2>学生姓名:{{studentName}}</h2>
<h2>学生年龄:{{age}}</h2>
</div>
`,
data() {
return {
studentName: '张三',
age: 18
}
}
})
const vm = new Vue({
el: '#root',
data: {
msg: 'hello!'
},
// 第二部:注册组件(局部注册)
components: {
school: school,
student: student
}
})
//定义全局组件
const hello = Vue.extend({
template: `
<div>
<h2>你好啊!{{name}}</h2>
</div>
`,
data() {
return {
name: 'tom'
}
}
})
// 第二步:全局注册组件
Vue.component('hello', hello)
new Vue({
el: '#root2',
})
</script>
</body>
</html>
2.组件的嵌套
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="./image/logo.ico" type="image/x-icon">
<title></title>
<script src="./vue.js"></script>
<style>
</style>
</head>
<body>
<div id="root">
<app></app>
</div>
<script>
const student={
template:`
<div>
<h2>{{name}}</h2>
<h2>{{age}}</h2>
</div>
`,
data(){
return{
name:'tom',
age:18
}
}
}
const school={
name:'xuexiao',
template:`
<div>
<h2>学校名称:{{schoolName}}</h2>
<h2>学校地址:{{address}}</h2>
<button @click="showName">点我提示学校名</button>
<student></student>
</div>
`,
data(){
return{
schoolName:'尚硅谷',
address:'上海',
}
},
methods: {
showName(){
alert(this.schoolName)
}
},
components:{
student
}
}
const hello=Vue.extend({
template:`
<h1>{{msg}}</h1>
`,
data(){
return{
msg:'欢迎来到尚硅谷学习'
}
}
})
const app=Vue.extend({
template:`
<div>
<hello></hello>
<school></school>
</div>
`,
components:{
school:school,
hello
}
})
const vm= new Vue({
el:'#root',
data:{
msg:'hello!'
},
components:{
app
}
})
</script>
</body>
</html>
3.组件中几个注意的点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="./image/logo.ico" type="image/x-icon">
<title></title>
<script src="./vue.js"></script>
<style>
</style>
</head>
<body>
<!-- 几个注意点:
1.关于组件名:
个单词组成:
第一种写法(首宁母小写): school
第二种写法(首字母大写): school
多个单词组成:
第一种写法(kebab-case命名): my-school
第二种写法(CamelCase命名): MySchool (需要Vue脚手架支持)
备注:
(1).组件名尽可能回避HTML中已有的元素名称,例如: h2、H2都不行。
(2)。可以使用name配置项指定组件在开发者工具中呈现的名字。
2.关于组件标签:
第一种写法:<school</school>
第二种写法:<school/>
备注:不用使用脚手架时,<schoo1/>会导致后续组件不能渲染
3。一个简写方式:
const school = Vue.extend(options) 可简写为: const school = options -->
<div id="root">
<h2>{{msg}}</h2>
<my-school></my-school>
</div>
<div id="root2">
<hello></hello>
</div>
<script>
const school={
name:'xuexiao',
template:`
<div>
<h2>学校名称:{{schoolName}}</h2>
<h2>学校地址:{{address}}</h2>
<button @click="showName">点我提示学校名</button>
</div>
`,
data(){
return{
schoolName:'尚硅谷',
address:'上海',
}
},
methods: {
showName(){
alert(this.schoolName)
}
},
}
const vm= new Vue({
el:'#root',
data:{
msg:'hello!'
},
components:{
'my-school':school,
}
})
</script>
</body>
</html>