Vue知识点整理(一)

1.v-show 如果为false 只是添加了一个display=true的描述,没有被真正的删除。
2.v-if 如果为false 是真正的在dom节点下删除这个节点
3. 数组更新检测
push() pop() split(),sort,reverse(),unshilf(),shilf()都可以影响原数组
filter(),concat(),slice(),map()新数组替换旧的数组,原数组不会改变,视图不会刷新
通过索引值来修改原数组的方式 原数组收到影响,但视图不会刷新
可以使用 datalist.splice(0,1,"chenchen")就可以了  删除从第0个开始的第一个
或者使用Vue.set(vm.datalist,0,"chenchen")
4.解决冒泡问题
孩子节点触发一个事件,父节点的事件也被触发了  冒泡问题
在调用孩子节点方法的时候,其父亲节点的方法也被触发了
原生的解决方法是调用$event.stopPropagation方法阻止,而在vue中,直接在 @click.stop
或者可以在父节点上使用@click.self来确保只有自己被点击了才触发方法

5.阻止默认行为
 例如a标签的跳转 <a href="www.baidu.com" @click.prevent="handleChangePage()"> 百度一下 </a>
 原生 $event.preventDefault()阻止默认行为
 vue使用@click.prevent
6.过滤应用
    当还没有学习计算属性的时候,可以采用复制data的方式来过滤应用,复制一份相同的列表,在方法中过滤后再进行赋值
      var newList = this.list.filter(item=>item.indexOf(this.mytext)>-1)
      this.dataList = newList
7.axios示例
      new Vue({
            el:"#box",
            data:{
                datalist:''
            },
            methods:{
                handleClick(){
                    axios.get("./js/test.json").then(res=>{
                        console.log(res.data.data.films)
                        this.datalist=res.data.data.films 
                    }).catch(err=>{
                        console.log(err);
                    })
                }
            }
        })
8.fetch示例
     new Vue({
            el: "#box",
            data: {
                dataList: []
            },
            methods: {
                handleClick() {
                    fetch("js/test.json").then(res => res.json()).then(res => {
                        console.log(res.data.films)
                        this.dataList = res.data.films
                    })
                }
            }
        })
9.计算属性
计算属性要比方法性能更高,在多个地方使用得话,计算属性只需要计算一次,而方法要调用多次,计算属性会缓存依赖的状态改变了,计算属性会重新计算一遍
10.利用计算属性解决知识点6
computed: {
                getMyDataList(){
                    return this.list.filter(item=>item.indexOf(this.mytext)>-1)
                }
            }
11.vue更新原理
 <!--更新原理就是被Setter方法拦截, 渲染函数,其实就是新的dom节点和老的dom节点进行对比.
        然后调用diff算法以补丁的形式打到真实的dom上。
        
        diff怎么对比的?
            1.dom节点同层级对比。
            2.按照同key值对比
            3.同组件对比
            两个标签一样,还会进行对比
    -->
12.组件
      //扩展html元素,封装可重用代码
        // Vue.component
        //组件编写与Vue实例的区别
        //自定义组件需要有一个root element
        //父子组件的data是无法共享的
        //组件可以有data,method,computed 但是 data必须是一个函数
      Vue.component("navbar",{
            template:`<div style="background:yellow">
                <button @click="handleClick()">返回</button>
                { {navbarname}}
                <button>首页</button>
                <child></child>
                <navbarchild></navbarchild>
                </div>`,
            methods: {
                handleClick(){
                    alert("返回")
                }
            },
            data(){
                return {
                    navbarname:"navbarname"
                }
            },
            //局部定义组件
            components:{
                navbarchild:{
                    template:`<div>navbarchild----只能在navbar中使用</div>`
                }
            }
        })
13.父组件传子组件(使用动态绑定)
    -如果想传递一个对象的话使用动态绑定
     //属性验证  校验一下父组件传过来的值是否符合属性 null为不限制类型 
            props:{
                myname:String,
                myshow:Boolean
            } 
14.子组件传递父组件
    子传父用的是事件向上传,
    在子组件中调用 this.$emit("父组件中的方法")
    <body>
    <div id="box">
        父组件
        <child @myevent="handleEvent($event)"></child>
    </div>
</body>
<script>
    Vue.component('child', {
        template: `<div>
                        child子组件
                        <button @click="paymoney()">click</button>
                        </div>`,
        data() {
            return {
                chilrdName: "子组件得状态"
            }
        },
        methods:{
            paymoney(){
                this.$emit("myevent",this.chilrdName) //分发事件
            }
           
        }
    })
    new Vue({
        el: '#box',
        methods: {
            handleEvent(ev) {
                console.log("父组件收到钱了"+ev)
            }
        }
    })
</script>
15.ref通信
ref 放在标签上 是一个原生节点
ref 放在组件上, 是一个组件对象
点击完会获取组件的对象。通过this.$refs.组件名.组件中的方法可以调用组件中的方法。
16.非父子组件的通信
    (1).//中央事件总线
     var bus = new Vue();//一个空的Vue实例就i是中央事件总线
    (2). //推送一个消息
           bus.$emit("weixinmessage",this.$refs.mytext.value);
    (3)在一个合适的地方进行监听
         //这是一个生命周期函数
            mounted() {
                //用总线进行监听
                bus.$on("weixinmessage",(data)=>{
                    console.log("收到推送"+data)
                })
                console.log("生命周期函数,当前组件dom创建完成 就会调用")
            }
<!--监听的用$on  被监听的用$emit-->

17.动态组件 使用:is
     <!--动态组件可以帮助我们更加方便管理多个组件
        <component>元素动态绑定多个组件到他的is属性上  这样会删除组件
        <keep-alive>保留状态,防止重新渲染
    -->
18.slot 插槽
  <!--前景,想在组件中添加一个div,但是会被template完全覆盖,这时候,
        在孩子组件中添加一个<slot>标签,插槽就是预留的位置,
        slot 内容分发  把父组件的内容分发到孩子组件中
       1. 目的:就是把父组件的内容与子组件的内容进行混合
        为什么要这么写?写死不行么?
        在其他页面也需要的时候,写死就不行了,组件使用别人的,数据使用自己的 ,就是不知道以后要写什么,预留出来的
      2.改造子传父
    -->
     <!--  父组件的内容在父组件作用域内编译,子组件的内容在子组件作用域编译-->
       3.在child里想把111放在child上面,把222放在child下面
        使用具名插槽  具有名字的插槽
        <child>
            <div slot="a">1111</div>
            <div slot="b">222</div>
        </child>

猜你喜欢

转载自blog.csdn.net/Chen_leilei/article/details/121723937