自学Vue six day!!!

1、自定义属性

1.1、局部自定义属性

实现类似v-show的自定义指令

<div id='app'>
        <button @click="isShow=!isShow">按钮</button>
        <p v-myshow="isShow"></p>
    </div>
    <script>
        new Vue({
            el: '#app',
            data: {
                isShow: true
            },
            directives: {
                myshow: {
                    bind(el, binding) {
                        // myshow这个指令绑定到元素上的时候执行这里的代码(页面一刷新就绑定上了)
                        // el表示 myshow这个指令  绑定的元素
                        // binding.value 表示这个指令对应的真实值
                        binding.value ? el.style.display = "block" : el.style.display = "none"
                    },
                    update(el, binding) {
                         // myshow这个指令的值一旦发生改变,就会执行这里的代码
                        binding.value ? el.style.display = "block" : el.style.display = "none"
                    }
                }
            }
        })
    </script>
复制代码

2.2、全局自定义属性

<div id='app'>
        <button @click="isShow=!isShow">按钮</button>
        <p v-myshow="isShow"></p>
    </div>
    <script>
        Vue.directive("myshow", {
            bind(el, binding) {
                // myshow这个指令绑定到元素上的时候执行这里的代码(页面一刷新就绑定上了)
                // el表示 myshow这个指令  绑定的元素
                // binding.value 表示这个指令对应的真实值
                binding.value ? el.style.display = "block" : el.style.display = "none"
            },
            update(el, binding) {
                // myshow这个指令的值一旦发生改变,就会执行这里的代码
                binding.value ? el.style.display = "block" : el.style.display = "none"
            }
        })
        new Vue({
            el: '#app',
            data: {
                isShow: true
            }
        })
    </script>
复制代码

2、Vue组件化开发(重点!!!)

组件化开发的优势:可维护性高 可复用性高

什么是组件化开发:面对复杂问题的处理方式,把问题拆解成很多个能处理的小问题,再将其放在整体中。(类似于俄罗斯套娃,将问题分解,然后重构)

组件化思想:

  1. 它提供了一种抽象,让我们可以开发出一个个独立可复用的小组件来构造我们的应用。
  2. 任何的应用都会被抽象成一颗组件树。

2.1、局部组件化开发

<div id='app'>
    <!-- 
        局部组件的书写流程:
        1、确定好组件名称
            components: {
                'my-header': {
                    template: '#tmp'
                }
            }
        2、书写template标签,确定HTML格式
        3、在页面中调用组件
     -->
        <my-header></my-header>
        <template id="tmp">
            <!-- 组件的HTML代码,组件模板 -->
            <div>
                <h1>标题</h1>
                <p>p标签!!</p>
            </div>
        </template>
    </div>
    <script>
        // 注意事项:
        // 1、定义组件的时候,组件名称可以为驼峰式命名,或者带-的命名方式 
        // 2、在页面中调用组件的时候,组件名称只能是带-的命名方式,驼峰式不行
        // 3、组件只能在绑定了Vue对象的标签内部使用
        // 4、组件只能有一个根标签
        new Vue({
            el: '#app',
            data: {

            },
            components: {
                'my-header': {
                    template: '#tmp'
                }
            }
        })
    </script>
复制代码

2.2、全局组件化开发

通过Vue.component('组件名称', {}),通过这个方法注册的都是全局组件,也就是他们再注册之后可以用在任何新创建的Vue 实例挂载的区域内。

<div id='app'>
        <my-header></my-header>

        <template id="tmp">
            <!-- 组件的HTML代码,组件模板 -->
            <div>
                <h1>标题</h1>
                <p>p标签!!</p>
            </div>
        </template>
    </div>
    <script>
        Vue.component('my-header', {
            template: '#tmp'
        })
        new Vue({
            el: '#app',
            data: {

            }
        })
    </script>
复制代码

2.3、组件的复用

1、声明这个组件标签的属性;

2、给属性赋值;

3、在组件中用胡子语法使用这个属性;

<div id='app'>
    	<!-- 2、给属性赋值 -->
        <my-header title='分类'></my-header>
        <my-header title='购物车'></my-header>
    </div>
    <template id="tmp">
        <div>
            <!-- 3、在组件中用胡子语法使用这个属性 -->
            <h1>{{title}}</h1>
            <p>p标签</p>
        </div>
    </template>
    <script>
        new Vue({
            el: '#app',
            data: {

            },
            components: {
                myHeader: {
                    template: '#tmp',
                    // 1、声明这个组件标签的属性
                    props: ['title']
                }
            }
        })
    </script>
复制代码

3、标签自定义

3.1、组件标签属性的默认值和类型

<div id='app'>
        <my-header title="购物车"></my-header>
        <my-header :title='tit'></my-header>
    </div>
    <template id="tmp">
        <div>
            <h1>{{title}}</h1>
            <p>this标签</p>
        </div>
    </template>
    <script>
        new Vue({
            el: '#app',
            data: {
                tit: '111'
            },
            components: {
                myHeader: {
                    template: '#tmp',
                    props: {
                        title: {
                            default: '默认值',
                            type: String
                        }
                    }
                }
            }
        })
    </script>
复制代码

3.2、组件也可以有自己的数据和方法

<div id='app'>
        <comp></comp>
    </div>
    <template id="tmp">
        <div>
            <p>{{num}}</p>
            <button @click='add()'>按钮</button>
        </div>
    </template>
    <script>
        let comp = {
            template: '#tmp',
            data() {
                return {
                    num: 20,
                }
            },
            methods: {
                add() {
                    this.num++
                }
            },
        }
        new Vue({
            el: '#app',
            data: {

            },
            components: {
                comp
            }
        })
    </script>
复制代码

4、父子组件间的通讯父级向子级传递

4.1、父级向子级传递

在组件中,使用选项props来声明需要从父级接收到的数据。
props的值有两种方式:

1. 字符串数组,数组中的字符串就是传递时的名称。
2. 对象,对象可以设置传递时的类型(String,Number,Boolean,Array, 		Object,Date,Function,Symbol),也可以设置默认值等。
复制代码

父传子的步骤总结:

1、先在子组件声明属性

2、组件被调用的时候,赋值属性

3、在子组件中使用这个属性

<div id='app'>
        <!--2、组件被调用的时候,赋值属性 -->
        <child-comp :title='parentTitle' :vue-obj='parentObj'></child-comp>
    </div>
    <template id="tmp">
        <div>
            <!-- 3、在子组件中使用这个属性 -->
            <h1>标题</h1>
            <p>{{title}}</p>
            <p>{{vueObj.name}}的年龄是:{{vueObj.age}}</p>
        </div>
    </template>
    <script>
        // 父传子的步骤总结:
        let childComp = {
            template: '#tmp',
            // 1、先在子组件声明属性
            props: ['title', 'vueObj']
        }
        new Vue({
            el: '#app',
            data: {
                parentTitle: '父组件的title',
                parentObj: {
                    name: 'Vue',
                    age: 8
                }
            },
            components: {
                childComp
            }
        })
    </script>
复制代码

4.2、子级向父级传递

父组件向子组件传递数据,通过自定义事件

子传父的步骤总结:

1、在父组件中先准备一个修改数据的方法;

2、定义自定义函数;

3、触发自定义事件,让changeNum这个函数来执行;

        <div id='app'>
        <!-- 2、    @fn  自定义事件  @事件名 = "事件触发时要执行的函数" -->
        <child-comp :num='palnum' @fn='changeNum'></child-comp>
    </div>
    <template id="tmp">
        <div>
            <p>{{num}}</p>
            <button @click='add(20)'>按钮</button>
        </div>
    </template>
    <script>
        // 单向数据流(只支持数据从父组件传到子组件)
        let childComp = {
            template: '#tmp',
            props: ['num'],
            methods: {
                add(val) {
                    // 修改父组件中的palnum
                    // 触发自定义事件fn
                    // $emit()专门来触发自定义事件,调用对应的函数
                    // this.$emit(事件名,参数1,参数2...)
                    // 3、触发自定义事件,让changeNum这个函数来执行
                    this.$emit('fn', val)
                }

            },
        }
        new Vue({
            el: '#app',
            data: {
                palnum: 20
            },
            components: {
                childComp
            },
            methods: {
                // 1、在父组件中先准备一个修改数据的方法
                changeNum(val) {
                    this.palnum += val
                }
            },
        })
    </script>
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享