0
点赞
收藏
分享

微信扫一扫

生命周期&数据共享

黄昏孤酒 2022-03-30 阅读 171
前端vue

3.1 组件的生命周期

1、概念

(1)生命周期:是指一个组件从创建、运行、销毁的整个阶段,强调的是一个时间段

(2)生命周期函数:是由vue框架提供的内置函数,会伴随组件的生命周期,自动按次序执行

2、生命周期函数示意图:Vue 实例 — Vue.js

3、生命周期函数

(1)组件创建阶段

  • beforeCreate()

    组件的props/data/methods尚未被创建,都处于不可用状态

  • created()

    组件的props/data/methods已创建好,都处于可用状态,但是组件的模板结构尚未生成

  • beforeMount()

    将要把内存中编译好的HTML结构渲染到浏览器中,此时浏览器中还没有当前组件的DOM结构

  • mounted()

    已经把内存中HTML结构,成功的渲染到了浏览器中,此时浏览器中已然包含了当前组件的DOM结构

(2)组件运行阶段

  • beforeUpdate()

    将要根据变化过后最新的数据,重新渲染组件的模板结构

  • updated()

    已经根据最新的数据,完成了组件DOM结构的重新渲染

(3)组件销毁阶段

  • beforeDestroy()

    将要销毁此组件,此时尚未销毁,组件还处于正常工作状态

  • destroyed()

    组件已经被销毁,此组件在浏览器中对应的DOM结构已被完全移除

3.2 组件之间的数据共享

1、组件之间的关系

在项目开发中常见的是:父子关系、兄弟关系

2、父子关系

(1)父向子传值:使用自定义属性(props)

注意:自定义属性定义在子组件中,不要修改props的值

(2)子向父传值:使用自定义事件

步骤:

  • 父组件接收emit回来的值

  • 父组件在methods中定义这个函数将其接收到父组件中

  • 子组件调用$emit()。修改数据时,通过$emit()触发自定义事件

<!--子组件-->
export default {
  data() {
    return {
      count: 0,
    };
  },
​
  methods: {
    add() {
      this.count += 1;
      this.$emit("changeNumber", this.count);
    },
  },
};
<!--父组件-->
<Son @changeNumber="getNumber"></Son>
export default {
  data() {
    return {
      countfromSon: 0,
    };
  },
  methods: {
    getNumber(val) {
      this.countfromSon = val;
    },
  },
  components: {
    Son,
  },
};

3、兄弟关系

(1)在vue2.x。兄弟组件之间的数据共享方案是EventBus

(2)EventBus使用步骤:

  • 创建EventBus.js模块,并向外共享一个Vue的实例对象

  • 在数据发送方,调用bus.$emit('事件名称',要发送的数据)方法触发自定义事件,在methods中

  • 在数据接收方,调用bus.$on('事件名称',事件处理函数)方法注册一个自定义事件,一般在created()中

(3)例子

<!-- 数据发送方 -->
<script>
// 导入EventBus.js
import bus from "@/components/EventBus.js";
​
export default {
  data() {
    return {
      str: "会挽雕弓如满月,西北望,射天狼。",
    };
  },
  methods: {
    send() {
      //   利用EventBus发送数据
      bus.$emit("share", this.str);
    },
  },
};
</script>
<!-- 数据接收方 -->
<script>
// 导入EventBus.js
import bus from "@/components/EventBus.js";
​
export default {
  data() {
    return {
      msgFromBro: "",
    };
  },
  created() {
    bus.$on("share", (val) => {
      this.msgFromBro = val;
    });
  },
};
</script>
<!-- EventBus.js -->
import Vue from 'vue'
export default new Vue()

3.3 ref引用

1、概念

(1)ref用来辅助开发者在不依赖于jQuery的情况下,获取DOM元素或组件的引用

(2)每个vue的组件实例上都包含一个$refs对象,里面存储着对应的DOM元素或组件的引用。默认情况下,组件的$refs指向一个空对象

2、使用ref引用DOM元素

  • 使用$refs:this.$refs.ref名称

  • ref名称不能重复

<h1 ref="myh1">App 根组件----{{ countfromSon }}</h1>
<button @click="showThis">打印this</button>
​
methods: {
    showThis() {
        this.$refs.myh11.style.color = "red";
        // console.log(this.$refs.myh11);
    },
},

3、使用ref引用组件实例

<!--使用ref属性为对应的组件添加引用名称-->
<Ref ref="comRef"></Ref>
<button @click="onReset">重置</button>
​
<script>
import Ref from "@/components/Ref.vue";
​
export default {
  methods: {
    onReset() {
        //调用子组件函数
      // this.$refs.comRef.reset();
        //调用子组件data值
      this.$refs.comRef.count = 0;
    },
  },
  components: {
    Ref,
  },
};
</script>

4、this.$nextTick(callback)

组件的this.$nextTick(callback)方法,会把callback回调推迟到下一个DOM更新周期之后执行

3.4 引申-数组方法

1、some循环

(1)forEach循环只要开始,在中间无法终止

(2)从数组中找元素用some,在找到对应项之后,用return true终止循环

(3)语法

arr.some((item, index) => {
    //循环语句,return true是为了终止循环
    return true
})

2、every循环

(1)判断数组中每一项是否被全选,全是true结果是true,有一个是false,结果就是false

(2)语法

 arr.every(item => item.state)

3、reduce方法

  • reduce就是累加器

  • 使用方法:reduce((累加的结果,当前循环项)=>{},初始值),reduce里面是箭头函数和初始值,每次循环之后第二个值都会相加

//当state为true时算总价
const arr = [
    { id: 1, name: '西瓜', state: false, price: 10, count: 1 },
    { id: 2, name: '苹果', state: true, price: 20, count: 2 },
    { id: 3, name: '榴莲', state: true, price: 50, count: 3 }
]
//方法1
let amt = 0
arr.filter(item => item.state).forEach(item => {
    amt += item.price * item.count
})
console.log(amt);
​
//方法2
const res = arr.filter(item => item.state).reduce((amt, item) => {
    return amt += item.price * item.count
}, 0)
console.log(res);
举报

相关推荐

0 条评论