prop

  官方解释:Prop 是你可以在组件上注册的一些自定义特性。当一个值传递给一个 prop 特性的时候,它就变成了那个组件实例的一个属性。

通俗点讲就是:prop是父组件用来传递数据的一个自定义属性

    

Vue.component('blog-post', {
props: ['title'],
template: '<h3>{{ title }}</h3>'
})

一个组件默认可以拥有任意数量的 prop,任何值都可以传递给任何 prop。在上述模板中,你会发现我们能够在组件实例中访问这个值,就像访问 data 中的值一样。

一个 prop 被注册之后,你就可以像这样把数据作为一个自定义特性传递进来:

<blog-post title="My journey with Vue"></blog-post>
<blog-post title="Blogging with Vue"></blog-post>
<blog-post title="Why Vue is so fun"></blog-post>

结果如下

单向数据流

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。(父传子可以,子传父不行)这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。

每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。(不能直接改props里面的值,可以定义一个属性或者方法来接受props里面的值后再操作)

官方举例:

1.这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。在这种情况下,最好定义一个本地的 data 属性并将这个 prop 用作其初始值:

props: ['initialCounter'],
data: function () {
return {
counter: this.initialCounter
}
}

2.这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性:

props: ['size'],
computed: {
normalizedSize: function () {
return this.size.trim().toLowerCase()
}
}

案例:prop父组件向子组件传值

父组件:

<template>
<div>
父组件:
<input type="text" v-model="name">
<br>
<br>
<!-- 引入子组件 -->
<child :inputName="name"></child>
</div>
</template>
<script>
import child from './child'
export default {
components: {
child
},
data () {
return {
name: ''
}
}
}
</script>

子组件:

<template>
<div>
子组件:
<span>{{inputName}}</span>
</div>
</template>
<script>
export default {
// 接受父组件的值
props: {
inputName: String,
required: true
}
}
</script>

$emit  子组件向父组件传值:自定义事件,this.$emit

子组件:

<template>
<div>
子组件:
<span>{{childValue}}</span>
<!-- 定义一个子组件传值的方法 -->
<input type="button" value="点击触发" @click="childClick">
</div>
</template>
<script>
export default {
data () {
return {
childValue: '我是子组件的数据'
}
},
methods: {
childClick () {
// childByValue是在父组件on监听的方法
// 第二个参数this.childValue是需要传的值
this.$emit('childByValue', this.childValue)
}
}
}
</script>

父组件:

<template>
<div>
父组件:
<span>{{name}}</span>
<br>
<br>
<!-- 引入子组件 定义一个on的方法监听子组件的状态-->
<child v-on:childByValue="childByValue"></child>
</div>
</template>
<script>
import child from './child'
export default {
components: {
child
},
data () {
return {
name: ''
}
},
methods: {
childByValue: function (childValue) {
// childValue就是子组件传过来的值
this.name = childValue
}
}
}
</script>

以上讲了父传子,子传父,那么非父子组件直接如何传值呢?

  网上搜到了这样一个例子:vue事件总线(vue-bus)可实现非父子组件传值

安装

$ npm install vue-bus

如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装 vue-bus:

import Vue from 'vue';
import VueBus from 'vue-bus';
Vue.use(VueBus);

如果使用全局的 script 标签,则无须如此(手动安装)。

1.公共实例文件bus.js,作为公共数控中央总线

import Vue from "vue";
export default new Vue();

2.在组件A中传递参数

import Bus from '../bus.js';
export default {
name: 'first',
data () {
return {
value: '我来自first.vue组件!'
}
},
methods:{
add(){// 定义add方法,并将msg通过txt传给second组件
Bus.$emit('txt',this.value);
}
}
}

3.在组件B中接受参数

import Bus from '../bus.js';
export default {
name: 'first',
data () {
return {
value: '我来自second.vue组件!'
}
},
methods:{
add(){// 定义add方法,并将msg通过txt传给second组件
Bus.$on('txt',()=>{
      this.message=this.vue;
    });
}
}
}

这样,就可以在第二个非父子关系的组件中,通过第三者bus.js来获取到第一个组件的value。

兄弟组件之间与父子组件之间的数据交互,两者相比较,兄弟组件之间的通信其实和子组件向父组件传值有些类似,其实他们的通信原理都是相同的,

例如子向父传值也是$emit和$on的形式,只是没有eventBus,但若我们仔细想想,此时父组件其实就充当了bus这个事件总线的角色。

这种用一个Vue实例来作为中央事件总线来管理组件通信的方法只适用于通信需求简单一点的项目,对于更复杂的情况,Vue也有提供更复杂的状态管理模式Vuex来进行处理,请自行到官网进行学习。

vue router按需加载

import VueRouter from 'vue-router'

import Layout from 'components/layout'
// import Layout_2 from 'components/layout1'
import HeadTopbar from 'components/head_top_bar'
import HeadTopbar1 from 'components/head_top_bar1'
import TopBar1 from 'components/top_bar1'
import TopBar2 from 'components/top_bar2'
import TopBar3 from 'components/top_bar3'
import TopBar4 from 'components/top_bar4'
import TopBar5 from 'components/top_bar5'
//MobileApp
// 登陆模块(按需加载,当渲染其他页面时才加载其组件,并缓存,减少首屏加载时间)
const Login = resolve => require(['views/login'], resolve)
const LocalAllList = resolve => require(['views/MobileApp/local_all_list'], resolve)
const Administration = resolve => require(['views/MobileApp/administration'], resolve)

computed 和 methods  watch区别

描述

vue 中computed 和methods 在使用效果来看可以说是一样的,但是深入看还是不一样的。区别就在于: computed 依赖缓存, methods 却不是。怎么理解呢?当Dom每次需要渲染computed的值,这个值已经处于缓存之中,不需要再重复的经历一遍计算过程,只有当computed依赖的数据变量发生变化,这个计算属性会自动更新,不需要渲染触发。methods 的值被获取的时候就会每次都会重新经历一遍计算过程。

所以由此可以看出,computed和methods 的应用场景 和 计算过程的复杂程度有关, 如果计算过程复杂庞杂,而且计算属性会被经常调用(getter),那么最好使用缓存;如果,需要的值,计算简单,调用不频繁,实时性比较高(存在异步请求),会比较适合methods

computed有缓存,若相关数据未发生变化,则不调用; 
methods无缓存,需要事件才能调用它(如点击等); 
watch多用于数据交互频繁的内容。(例如定时axios从服务器获取数据)。

vue 中一些API 或属性的常见用法的更多相关文章

  1. vue中computed(计算属性)和watch在实现父子组件props同步时的实际区分

    vue中computed和watch的对比是一个很有意思的话题. 看过官网教程以后,我们往往更倾向多使用computed.computed优点很多,却在某些时候不太适用. 今天我们就稍微讨论一下,当我 ...

  2. Vue中如何监控某个属性值的变化?

    比如现在需要监控data中, obj.a 的变化.Vue中监控对象属性的变化你可以这样: deep属性表示深层遍历,但是这么写会监控obj的所有属性变化,并不是我们想要的效果,所以做点修改: 还有一种 ...

  3. vue中TinyMCE图片 “data-mce-src” 属性的问题

    1.问题 在使用Vue中使用TinyMCE富文本编辑器时,上传的图片除了src属性还会多出来个"data-mcee-src" 属性,而保存时实际也是保存的"data-mc ...

  4. vue中为computed计算属性传参遇到的问题,已解决

    首先介绍下项目背景, 需要将 dataList 中的 item.stars 属性传入 computed 返回要展示的值 部分代码如下(请不要纠结为什么这么做,数据格式确认如此): <li cla ...

  5. vue中部分api解释 ($nextTick)

    1:this.$nextTick(function(){ }) 传如的参数是一个函数 这个API主要是获取dom元素 为什么需要这个api,在vue框架开发中,更新dom是一个异步操作,如果更新完do ...

  6. 在vue中scss通过scoped属性设置局部变量如何设置框架样式

    应用场景:在使用vue的大型单页应用页面中,我们可以通过使用scoped属性将当前组件的样式设置局部样式 界面被scoped局部化之后,不能覆盖界面里面的子组件样式,因为样式只对当前界面生效.(可以加 ...

  7. 009——VUE中watch监听属性变化实现类百度搜索栏功能

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 006——VUE中的内容与属性中使用javascript表达式的方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 在Vue 中调用数据出现属性不存在的问题

    这已经是我在调用数据时趟过几次的坑了,索性记录下来防止后面再犯: 一般我们请求数据来渲染一个页面的时候,请求下来的数据基本上都是数组或是对象,再通过列表循环和插值表达式渲染的页面:在data 中提前声 ...

随机推荐

  1. 阶段3 2.Spring_09.JdbcTemplate的基本使用_1 今日课程内容介绍

  2. 想使用 MongoDB ,你应该了解这8个方面!

    想使用 MongoDB ,你应该了解这8个方面! 应用性能高低依赖于数据库性能,MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解 ...

  3. SAS数据挖掘实战篇【七】

    SAS数据挖掘实战篇[七] 6.5  SAS EM数据挖掘-----预测模型 1  问题定义 目标:建立模型预测贷款申请的信用状态,选择最优的模型来预测和减少损失. 数据集:SAMPSIO.DMAGE ...

  4. 获取重复字符串的range,设置attributedText

    之前项目的需求是未读人员显示绿色,已读人员显示黑色,测试今天提bug说存在未读人员显示的黑色...这就尴尬了,我完全不知道为啥,经过打断点调试程序,终于找到问题:就是他只会获取到第一个想等字符的ran ...

  5. Object Creation

    Although using the object constructor or an object literal are convenient ways to create single obje ...

  6. 【翻唱】学习日语歌 (青鸟)火影忍者 OP

    我的翻唱:https://node.kg.qq.com/play?s=Q1cY4PQ2-2VP6QOM&g_f=personal 中文音译: 哈巴哒伊哒啦 摸多啦呐伊哆伊迭 内杂西耷诺哇 啊哦 ...

  7. js移动端滑动效果

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...

  8. [JS] 点击按钮触发后台事件前,弹出确认框

    只需要在button中设置onclick属性触发事件即可 下面以ASP.NET代码为例, ASP.NET中按钮客户端触发js代码的属性是OnClientClick <asp:Button ID= ...

  9. Java网络爬虫

    一.前言 首先我们把准备工作做好:IDEA 2019.1.JDK1.8.Maven3.5 Jsoup的Maven依赖: <dependency> <groupId>org.js ...

  10. etcd集群移除节点

    查看当前集群信息 # etcdctl member list --write-out=table +------------------+---------+--------------------+ ...