美文网首页
weex基础知识

weex基础知识

作者: 喝酸奶舔下盖 | 来源:发表于2019-08-02 15:21 被阅读0次

    weex学习最开始的时候应该多理解核心概念和运作方式,关键的组件要记牢,达到一出现这个组件就知道涵义,如果临时去翻阅文档才回到意思的话效率就太低了,基础很重要。
    还有一些核心概念一定要了解清楚,包括以下几点:

    一、数据绑定机制

    1.单向绑定

    单向数据绑定的实现思路:

    • 所有数据只有一份

    • 一旦数据变化,就去更新页面(只有data-->DOM,没有DOM-->data)

    • 若用户在页面上做了更新,就手动收集(双向绑定是自动收集),合并到原有的数据中。

    
    <!DOCTYPE html>
    <html>
    <head></head>
    <body>
        <div id="app">
            {{message}}
        </div>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    message: '单向绑定示例'
                }
            });
        </script>
    </body>
    
    

    2.双向绑定

    数据的双向绑定是vue实现的一大功能。

    使用v-model指令,实现视图和数据的双向绑定。

    所谓双向绑定,指的是vue实例中的data与其渲染的DOM元素的内容保持一致,无论谁被改变,另一方会相应的更新为相同的数据。这是通过设置属性访问器实现的。

    v-model主要用在表单的input输入框,完成视图和数据的双向绑定。

    v-model只能用在<input><select><textarea>这些表单元素上。

    双向绑定的缺点:不知道data什么时候变了,也不知道是谁变了,变化后也不会通知,当然可以watch来监听data的变化,但这复杂,还不如单向绑定。

    <!DOCTYPE html>
    <html>
    <head></head>
    <body>
        <div id="app">
            <input type="text" v-model="message">
            <p>{{message}}</p>
        </div>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    message: ''
                }
            });
        </script>
    </body>
    

    二、组件通讯

    组件通讯包括:父子组件间的通信和兄弟组件间的通信。在组件化系统构建中,组件间通信必不可少的。

    1.父组件 --> 子组件

    • 属性设置
      父组件关键代码如下
    <template>
        <Child :child-msg="msg"></Child>
    </template>
    

    子组件关键代码如下

    export default {
      name: 'child',
      props: {
        child-msg: String
      }
    };
    

    child-msg 为父组件给子组件设置的额外属性值,属性值需在子组件中设置props,子组件中可直接使用child-msg变量。

    • 子组件调用父组件
      子组件通过 parent 获得父组件,通过root 获得根父组件。

    2.子组件--> 父组件

    • 发送事件/监听事件
      子组件中某函数内发送事件:
    this.$emit('toparentevent', 'data');
    

    父组件监听事件:

    <Child :msg="msg" @toparentevent="todo()"></Child>
    

    toparentevent 为子组件自定义发送事件名称,父组件中@toparentevent为监听事件,todo为父组件处理方法。

    3. 父组件直接获取子组件属性或方法

    给要调用的子组件起个名字。将名字设置为子组件 ref 属性的值。

    <child-component ref="aName"></child-component>
    

    父组件中通过 $refs.组件名 来获得子组件,也就可以调用子组件的属性和方法了。

    var child = this.$refs.aName
    child.属性
    child.方法()
    

    父组件通过 $children 可以获得所有直接子组件(父组件的子组件的子组件不是直接子组件)。

    • Bus中央通信
      目前中央通信是解决兄弟间通信,祖父祖孙间通信的最佳方法,不仅限于此,也可以解决父组件子组件间的相互通信。如下图:
    Bus中央通信

    各组件可自己定义好组件内接收外部组件的消息事件即可,不用理会是哪个组件发过来;而对于发送事件的组件,亦不用理会这个事件到底怎么发送给我需要发送的组件。

    先设置Bus

    //bus.js 
    import Vue from 'vue'
    export default new Vue();
    

    组件内监听事件

    import bus from '@/bus';
    
    export default {
      name: 'childa',
      methods: {
      },
      created() {
        bus.$on('childa-message', function(data) {
          console.log('I get it');
        });
      }
    };
    

    发送事件的组件

    import bus from '@/bus';
    //方法内执行下面动作
    bus.$emit('childa-message', this.data);
    

    三、生命周期

    1.生命周期钩子函数

    首先,每个Vue实例在被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期。首先看一张官方文档上的图片


    Vue生命周期

    可以看到在vue一整个的生命周期中会有很多钩子函数提供给我们在vue生命周期不同的时刻进行操作, 所有的钩子函数如下

    生命周期钩子 组件状态 最佳实践
    beforeCreate 实例初始化之后,this指向创建的实例,不能访问到data、 computed、watch、methods上的方法和数据 常用于初始化非响应式变量
    created 实例创建完成,可访问data、computed、watch、methods上的方法和数据,未挂载到DOM,不能访问到el属性,ref属性内容为空数组 常用于简单的ajax请求,页面的初始化
    beforeMount 在挂载开始之前被调用,beforeMount之前,会找到对应的template,并编译成render函数 -
    mounted 实例挂载到DOM上,此时可以通过DOM API获取到DOM节点,$ref属性可以访问 常用于获取VNode信息和操作,ajax请求
    beforeUpdate 响应式数据更新时调用,发生在虚拟DOM打补丁之前 适合在更新之前访问现有的DOM,比如手动移除已添加的事件监听器
    updated 虚拟 DOM 重新渲染和打补丁之后调用,组件DOM已经更新,可执行依赖于DOM的操作 避免在这个钩子函数中操作数据,可能陷入死循环
    beforeDestroy 实例销毁之前调用。这一步,实例仍然完全可用,this仍能获取到实例 常用于销毁定时器、解绑全局事件、销毁插件对象等操作
    destroyed 实例销毁后调用,调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁 -

    注意: vue2.0之后主动调用$destroy()不会移除dom节点,作者不推荐直接destroy这种做法,如果实在需要这样用可以在这个生命周期钩子中手动移除dom节点

    2.单个组件的生命周期

    • 初始化组件时,仅执行了beforeCreate/Created/beforeMount/mounted四个钩子函数
    • 当改变data中定义的变量(响应式变量)时,会执行beforeUpdate/updated钩子函数
    • 当切换组件(当前组件未缓存)时,会执行beforeDestory/destroyed钩子函数
    • 初始化和销毁时的生命钩子函数均只会执行一次,beforeUpdate/updated可多次执行

    3.父子组件的生命周期

    • 仅当子组件完成挂载后,父组件才会挂载
    • 当子组件完成挂载后,父组件会主动执行一次beforeUpdate/updated钩子函数(仅首次)
    • 父子组件在data变化中是分别监控的,但是在更新props中的数据是关联的(可实践)
    • 销毁父组件时,先将子组件销毁后才会销毁父组件

    4.兄弟组件的生命周期

    • 组件的初始化(mounted之前)分开进行,挂载是从上到下依次进行
    • 当没有数据关联时,兄弟组件之间的更新和销毁是互不关联的

    此外还有一些点需要我们在学习时注意:(变量的标识、方法调用、如何对应关系、模板指令、特殊属性、以及命名规则等)

    vue基础题目:

    1. v-show和v-if指令的共同点和不同点?
    v-show指令是通过修改元素的displayCSS属性让其显示或者隐藏
    v-if指令是直接销毁和重建DOM达到让元素显示和隐藏的效果
    
    2.如何让CSS只在当前组件中起作用
    将当前组件的<style>修改为<style scoped>
    
    3.父、子组件间是如何通信的?
    在Vue中,每个组件实例的作用域是孤立的。这也意味着不能(也不应该)在子组件的模板内直接饮用父组件的数据。父组件通过Props向子组件传递数据,而子组件通过Events向父组件传递数据
    
    4.请列举出3个Vue中常用的生命周期钩子函数?
    BeforeCreate、Created、BeforeMount、Mounted、BeforeUpdate、Update、beforeDestory、Destory.
    
    5.Vue的双向数据绑定原理是什么?
    Vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
    
    6.说出至少4种vue当中的指令和它的用法?
    v-if:判断是否隐藏;v-for:数据循环出来;v-bind:class:绑定一个属性;v-model:实现双向绑定
    
    7.delete和Vue.delete删除数组的区别?
    delete只是被删除的元素变成了 empty/undefined 其他的元素的键值还是不变。 Vue.delete直接删除了数组 改变了数组的键值。
    
    
    8.下列关于vue的组件说法不正确的是( BC )
    A.不一定要写style
    B.template视图里可以写多个div容器
    C.父组件给子组件传值需定义props属性
    D.子组件与父组件通信需定义$emit属性
    
    9.下面关于vue的声明周期说法不正确的是( D )
    A.总共分为8个阶段:创建前/后、载入前/后、更新前/后、销毁前/后、
    B.updated和beforeUpdate分别是更新完成和更新前
    C.创建后this才可以获取属性、mounted时$el节点才被渲染
    D.created创建后$el就不是undefined了
    
    10.下面关于js框架说法正确的是( ABCD )
    A.Vue是一个MVVM框架
    B.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件
    C.Vue中可以使用 v-for 指令来循环对象
    D.在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定
    
    

    参考:

    1.vue官网教程

    2.vue官网API

    3.vue生命周期深入

    相关文章

      网友评论

          本文标题:weex基础知识

          本文链接:https://www.haomeiwen.com/subject/vwmldctx.html