学习Vue日记第三天

钩子函数
beforeCreate和created的使用//创建前和创建后

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">{{msg}}</div>
<script>
    var vm=new Vue({
        el:'#app',
        data:{
            msg:'张三'
        },
        beforeCreate(){
            console.log('实例创建之前');
            console.log(this.$data.msg);
        },
        created(){
            console.log('实例创建之后');
            console.log(this.$data.msg)
        }
    })
</script>
</body>

</html>

页面挂载
挂载点el存在
beforeMount和mounted//挂载前和挂载后

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">{{msg}}</div>
</body>
<script>
    var vm=new Vue({
        el:'#app',
        data:{
            msg:'张三'
        },
        beforeMount(){
            console.log('挂载之前')
            console.log(this.$el.innerHTML)
        },
        mounted(){
            console.log('挂载之后')
            console.log(this.$el.innerHTML)
        }
    })
</script>
</html>

数据更新
挂载完成后数据变化,执行beforeUpdate和updated

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">
        <div v-if="isShow" ref="self">test</div>
        <button @click="isShow=!isShow">更新</button>
    </div>
    <script>
        var vm=new Vue({
            el:'#app',
            data:{
                isShow:false
            },
            beforeUpdate(){
                console.log('更新之前')
                console.log(this.$refs.self)
            },
            updated(){
                console.log('更新之后')
                console.log(this.$refs.self)
            }
        })
    </script>
</body>
</html>

实例销毁
beforeDestroy和destroyed//销毁前和销毁后

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">
    <div ref="self">test</div>
    </div>
    <script>
        var vm=new Vue({
            el:'#app',
            data:{
                msg:'张三'
            },
            beforeDestroy(){
                console.log('之前')
                console.log(this.$refs.self)
                console.log(this.msg)
                console.log(vm)
            },
            destroyed(){
                console.log('销毁之后')
                console.log(this.$refs.self)
                console.log(this.msg)
                console.log(vm)
            }
        })
    </script>
</body>
</html>

自定义组件
Vue.directive

<!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>Document</title>
    <script src='../vue.js'></script>
</head>
<body>
    <div id="app">
        <input type="text" v-focus="true">
    </div>
    <script>
        Vue.directive('focus',{
            inserted(el,binding){
                if(binding.value){
                    el.focus()
                }
            }
        })
        var vm=new Vue({ el :'#app'})
    </script>
</body>
</html>

Vue.use安装插件

<!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>Document</title>
    <script src="../vue.js"></script>
</head>

<body>
    <div id="app" v-my-directive>
    </div>
    <script>
        //定义自定义插件对象
        let MyPlugin={}
        //编写插件的install方法
        MyPlugin.install=function(Vue,options){
            console.log(options)
            //在插件中为vue添加自定义指令
            Vue.directive('my-directive',{
                bind(el,binding){
                    //为指令v-my-directive绑定的DOM元素设置style样式
                    el.style='width:100px;height:100px;background-color:#ccc'
                }
            })
        }
        Vue.use(MyPlugin,{someOption:true})
        var vm=new Vue({
            el:'#app'
        })
    </script>
</body>

</html>

Vue.extend构造器扩展

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app1">app1:{{title}}</div>
    <div id="app2">app2:{{title}}</div>
    <script>
        var Vue2=Vue.extend({
            data(){
                return {title:'hello'}
            }
        })
        var vm1=new Vue({el:'#app1'})
        var vm2=new Vue2({el:'#app2'})
    </script>
</body>
</html>

Vue.set响应式对象添加属性

<!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>Document</title>
    <script src="../vue.js"></script>
</head>

<body>
    <div id="app">
        <div>{{a}}</div>
        <div>{{obj.b}}</div>
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                a: 'woshi',
                obj: {},
            },
           
        }) 
        Vue.set(vm.obj, 'b', '我是新加进来的')
    </script>
</body>

</html>

Vue.mixin全局注册混入

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app"></div>
    <script>
        Vue.mixin({
            created(){
                var myOption = this.$options.myOption
                if(myOption){
                    console.log(myOption.toUpperCase())
                }
            }
        })
        var vm=new Vue({myOption:'hello vue!'})
    </script>
</body>
</html>

vm.$props接受从上级组件向下传递的数据

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">
        <!-- 父组件 -->
        <my-parent></my-parent>
    </div>
    <template id="parent">
        <div>
            <h3>手机信息搜索</h3>
            手机品牌:<input type="text" v-model="brand">
            <!-- 子组件 -->
            <my-child v-bind:name="brand"></my-child>
        </div>
    </template>
    <!-- 子组件模板 -->
    <template id="child">
        <ul>
            <li>手机品牌:{{show.brand}}</li>
            <li>手机型号:{{show.type}}</li>
            <li>市场价格:{{show.price}}</li>
        </ul>
    </template>
    <script>
        Vue.component('my-parent',{
            template:'#parent',
            data(){
                return{
                    brand:''
                }
            }
        })
        Vue.component('my-child',{
            template:'#child',
            data(){
                return{
                    content:[
                        {
                            brand:'华为',type:'mate20',price:'20000'
                        },
                        {
                            brand:'vivo',type:'z3',price:'1999'
                        },
                        {
                            brand:'一加',type:'OnePlus7',price:'2999'
                        },
                        {
                            brand:'三星',type:'S8',price:'3299'
                        },
                        {
                            brand:'苹果',type:'iPhonex',price:'4000'
                        },
                    ],
                    show:{brand:'',type:'',price:''}
                }
            },
            props:['name'],
            watch:{
                name(){
                    if(this.$props.name){
                        var found=false
                        this.content.forEach((value,index)=>{
                            if(value.brand==this.$props.name){
                                found=value
                            }
                        })
                        this.show=found ? found:{brand:'',type:'',price:''}
                    }
                    else{
                        return
                    }
                }
            }
        })
        var vm=new Vue({
            el:'#app',
            data:{}
        })
    </script>
</body>
</html>

vm.$options传入选项
数组 对象 函数

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">
        <p>{{base}}</p>
        <p>{{noBase}}</p>
    </div>
    <script>
        var vm=new Vue({
            el:'#app',
            customOption:'我是自定义数据',
            data:{
                base:'我是基础数据'
            },
            created(){
                this.noBase=this.$options.customOption
            }
        })
    </script>
</body>
</html>

vm.$el访问vm实例使用的根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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">
        <p>我是根标签结构</p>
    </div>
    <script>
        var vm=new Vue({
            el:'#app'
        })
        vm.$el.innerHTML='<div>我是替换后的div标签</div>'
    </script>
</body>
</html>

vm.$children访问实例的直接子组件

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">
        <button @click="child">查看子组件</button>
        <my-component></my-component>
    </div>
    <script>
        Vue.component('my-component',{template:'<div>myComponent</div>'})
        var vm=new Vue({
            el:'#app',
            methods:{
                child(){
                    console.log(this.$children)
                }
            }
        })
    </script>
</body>
</html>

vm.$root访问组件树的根Vue实例

<!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>Document</title>
    <script src="../vue.js"></script>
</head>

<body>
    <div id="app">
        <my-component></my-component>
    </div>
    <script>
        Vue.component('my-component', {
            template: '<button @click="root">查看根实例</button>',
            methods:{
                root(){
                    console.log(this.$root)
                    console.log(this.$root==vm.$root)
                }
            }
        })
        var vm=new Vue({el:'#app'})
    </script>
</body>

</html>

vm.$slots访问定义在组件内部的template模板

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">
        <my-component>你好</my-component>
    </div>
    <template id="first">
        <div>
            <slot></slot>
        </div>
    </template>
    <script>
        Vue.component('my-component',{template:'#first'})
        var vm=new Vue({el:'#app'})
    </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>Document</title>
    <script src="../vue.js"></script>
</head>

<body>
    <div id="app">
        <my-component>你好
            <template v-slot:second>
                <div>内部结构</div>
            </template>
        </my-component>
    </div>
    <template id="first">
        <div>
            <slot></slot>
            <slot name="second"></slot>
            </p>
    </template>
    <script>
        Vue.component('my-component', { template:'#first' })
        var vm = new Vue({ el: '#app' })
        console.log(vm.$children[0].$slots.second[0].children[0].text)
    </script>
</body>

</html>

vm.$attrs获取组件属性,不包括class,style,以及被声明prop的属性

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">
        <my-component id="test"></my-component>
    </div>
    <script>
        Vue.component('my-component',{template:'<button @click="showAttrs">查看属性</button>',
        methods:{
            showAttrs(){
                console.log(this.$attrs)
            }
        }
        })
        var vm=new Vue({el:'#app'})
    </script>
</body>
</html>

全局配置,关闭提示信息
引入vue.js情况下
Vue.config.productionTip=false

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <script>
        Vue.config.productionTip=false
    </script>
</body>
</html>

silent取消vue日志和警告

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">
        {{msg}}
    </div>
    <script>
        Vue.config.silent = true
        var vm=new Vue({el:'#app'})
    </script>
</body>
</html>

devtools不允许调试

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <script>Vue.config.devtools=false</script>
</body>
</html>

组件进阶
mixins是分发组件可复用功能的方式

<!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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <script>
        // 定义myMixin对象
        var myMixin={
            created(){
                this.hello()
            },
            methods:{
                hello(){
                    console.log('hello from mixin!')
                }
            }
        }
        var Component=Vue.extend({
            mixins:[myMixin]
        })
        var component=new Component()
    </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>Document</title>
    <script src="../vue.js"></script>
</head>

<body>
    <script>
        var mixin = {
            data() {
                return { message: 'hello' }
            }
        }
        var vm=new Vue({
            mixins:[mixin],
            data:{
                message:'goodbye'
            },
            created(){
                console.log(this.$data.message)
            }
        })
    </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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <script>
        var mixin={
            created(){
                console.log('gouzi')
            }
        }
        var vm=new Vue({
            mixins:[mixin],
            created(){
                console.log('组件函数')
            }
        })
    </script>
</body>
</html>

render实现虚拟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>Document</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">
        <my-component>成功渲染</my-component>
    </div>
    <script>
        Vue.component('my-component',{
            render(createElement){
                return createElement('p',{
                    style:{
                        color:'red',
                        fontsize:'16px',
                        backgroundColor:'#eee'
                    }
                },this.$slots.default)
            }
        })
        var vm=new Vue({el:'#app'})
    </script>
</body>
</html>

createElement创建虚拟节点

<!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>Document</title>
    <script src="../vue.js"></script>
</head>

<body>
    <div id="app">
        <my-component>
            <template v-slot:header>
                <div style="background-color: #ccc;height: 50px;">
                    这里是导航栏</div>
            </template>
            <template v-slot:content>
                <div style="background-color: #ddd;height: 50px;">
                    这里是图书展示信息</div>
            </template>
            <template v-slot:footer>
                <div style="background-color: #eee;height: 50px;">
                    这里是底部信息</div>
            </template>
        </my-component>
    </div>
    <script>
        Vue.component('my-component', {
            render(createElement) {
                return createElement(
                'div', [createElement('header', this.$slots.header),
                createElement('content', this.$slots.content), createElement('footer', this.$slots.footer)])
            }
        })
        var vm=new Vue({el:'#app'})
    </script>
</body>

</html>

明天加油!!!!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值