vue第三周

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>

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值