点击事件和v-if(v-show)的组合使用

  1. <template>
  2. <div class="aBody">
  3. <span class="title">我,子组件。</span>
  4. <!-- 通过v-ifv-show的方式让标签消失出现 -->
  5. <span class="info" v-show="isShow">{{title}}</span>
  6. <span class="info" v-if="isShow">{{title}}</span>
  7. <!-- btn添加点击事件 @ v-on: 的语法糖-->
  8. <button class="btn" @click="changeInfo">展示info</button>
  9. </div>
  10. </template>
  11. <script>
  12. export default {
  13. data(){
  14. // 必须有返回值,且返回一个对象
  15. // 返回的是一个vue的对象,所以里面的变量可以是用, this.xxx获取
  16. return {
  17. title:'',
  18. isShow:false
  19. }
  20. },
  21. methods:{
  22. changeInfo:function() {
  23. this.title = '啊被发现了吗! ,,ԾㅂԾ,,';
  24. // 点击后将isShow取反后的值赋值给他自己,
  25. // 以实现通过点击然一个标签消失,出现
  26. this.isShow = !this.isShow;
  27. }
  28. }
  29. }
  30. </script>
  31. <style>
  32. .btn {
  33. width: 100px;
  34. }
  35. </style>

slot插槽

通过使用插槽可以在子组件中写入信息,如下:

  1. <JuniorSon @results = "accept" class="son" :index = 'infos' item = 'haha'>
  2. <span>{{something}}</span>
  3. <span v-show="isShow">son发来贺电:{{toBStr}}</span>
  4. <button class="f-btn">点击发送信息给son</button>
  5. </JuniorSon>

在子组件中通过slot接收上面JuniorSon标签中的信息,否则JuniorSon标签中的信息就不会显示
slot所在位置就是JuniorSon标签中的信息所在位置

  1. <template>
  2. <div class="aBody">
  3. <!-- 插槽让组件的标签可以些内容,这些内容将放到slot -->
  4. <slot></slot>
  5. </div>
  6. </template>

计算函数

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。
通过计算函数,减少标签中的逻辑性代码
计算函数都放在computed中,并且计算函数不能使用箭头函数(除非你不使用this)
如下计算函数toBStr,在使用时直接使用函数名即可

  1. <JuniorSon @results = "accept" class="son" :index = 'infos' item = 'haha'>
  2. <span>{{something}}</span>
  3. <span v-show="isShow">son发来贺电:{{toBStr}}</span>
  4. <button class="f-btn">点击发送信息给son</button>
  5. </JuniorSon>
  6. export default {
  7. components:{
  8. JuniorSon
  9. },
  10. data() {
  11. return {
  12. something:'我是你爸爸',
  13. infos:'我是你爸爸,我有钱。哎╮(╯_╰)╭',
  14. // 存放son传递过来的数据
  15. sonData:[],
  16. isShow:false
  17. }
  18. },
  19. methods:{
  20. // 通过自定义事件接收juniorSon发送的信息
  21. accept:function(event) {
  22. // 打印信息
  23. console.log(event,arguments)
  24. // 将信息存入sonData
  25. const list = Array.from(arguments);
  26. list.forEach(item => {
  27. this.sonData.push(item);
  28. })
  29. // 接收并显示信息
  30. this.isShow = true
  31. }
  32. },
  33. computed:{
  34. toBStr:function(){
  35. let str = '';
  36. this.sonData.forEach(item => {
  37. str += item + ' ';
  38. })
  39. return str;
  40. }
  41. }
  42. }

监听函数

监听函数一般放在watch中
函数名就是需要监听的变量名,
参数1—变化后的值
参数2—变化前的值

  1. watch:{
  2. isShow:function(newData,oldData) {
  3. console.log(newData,oldData);
  4. }
  5. }

组件的生命周期

生命周期函数

beforeCreate(){}
created(){}
beforeMount(){}
mounted(){}
beforeUpdate(){}
updated(){}
beforeDestroy(){}
destroyed(){}

生命周期的4个阶段

create
mount
update
destroy

生命周期函数的使用

  1. export default {
  2. beforeCreate(){
  3. console.log('实例化前')
  4. },
  5. created(){
  6. console.log('完成实例')
  7. },
  8. beforeMount(){
  9. console.log('挂载前')
  10. },
  11. mounted(){
  12. console.log('完成挂载')
  13. },
  14. beforeUpdate(){
  15. console.log('数据更新,视图未更新')
  16. },
  17. updated(){
  18. console.log('数据更新,视图更新')
  19. },
  20. beforeDestroy(){
  21. console.log('销毁前')
  22. },
  23. destroyed(){
  24. console.log('销毁完成')
  25. }}

双向绑定

v-model

通过向input中输入值,v-model将输入的值保存到message中,

  1. <div class="cla">{{message}}</div>
  2. <input type="text" v-model="message">

请求接口的时机

created(){}中请求接口
接口的请求是异步的(请求的时间不确定),解决
1.默认值
2.loading
数据没有加载完就使用默认的数据(loading显示),加载完成后就使用真正的数据(loading隐藏)
数据没有加载完就只能看见loading的加载页面

父组件,子组件传值

父组件传值子组件

1.在父组件中先引入子组件,并注册。
2.然后就可以通过给组件JuniorSon设置动态绑定的属性,或静态属性,将数据传递给子组件

  1. <!-- : v-bind: 的语法糖 使用后属性就可以直接使用变量了 -->
  2. <!-- 如果传递给子组件的信息是自定义属性,这样子组件的props不能获取到传递的信息,但可以通过this.$attrs获取到自定义属性信息 -->
  3. <JuniorSon @results = "accept" class="son" :index = 'infos' item = 'haha'>
  4. <span>{{something}}</span>
  5. <span v-show="isShow">son发来贺电:{{toBStr}}</span>
  6. <button class="f-btn">点击发送信息给son</button>
  7. </JuniorSon>

3.子组件通过props接收父组件传过来的信息
4.接收完毕后就可以使用了,用法和data中的变量一样

this.$props指向vue实例的props
this.props指向data中的props
this.$attrs可以获取到父组件传递过来的自定义属性的信息(如果没有在props中接收,那么就可以在attrs中找到未被接收的信息,如果props将数据全部接收那么,attrs中就没有可用的数据)
props有两种接收信息的方式

  1. props: ["index","item"]
  2. //通过数组接收信息,变量名就是前面的自定义属性名(不能改变)
  1. props:{
  2. index:{
  3. type:String,
  4. required:true
  5. },
  6. item:{
  7. type:String,
  8. required:true
  9. }
  10. },
  11. //通过对象接收信息,这样可以设置每一个变量的类型等。

子组件接收数据注意事项

子组件接受的父组件的值分为——引用类型和普通类型两种,
1.普通类型:字符串(String)、数字(Number)、布尔值(Boolean)、空(Null)
2.引用类型:数组(Array)、对象(Object)

其中,普通类型是可以在子组件中更改,不会影响其他兄弟子组件内同样调用的来自父组件的值,
但是,引用类型的值,当在子组件中修改后,父组件的也会修改,
那么后果就是,其他同样引用了改值的子组件内部的值也会跟着被修改。
除非你有特殊的要求这么去做,否则最好不要这么做。

父组件传给子组件的值,在子组件中千万不能修改,因其数据是公用的,改了所有引用的子组件就都改了。

子组件传递数据给父组件

子组件通过this.$emit()将数据传给父组件

  1. // 参数1---父子间中,使用子组件时定义的自定义事件的事件处理函数
  2. // 参数2,3,4---传递参数
  3. this.$emit('results','你是个大帅逼','没错说的就是你','big SB',)

父组件通过JuniorSon上的自定义事件的事件处理函数,接收并处理数据

  1. <!-- 如果传递给子组件的信息是自定义属性,这样子组件的props不能获取到传递的信息,但可以通过this.$attrs获取到自定义属性信息 -->
  2. <JuniorSon @results = "accept" class="son" :index = 'infos' item = 'haha'>
  3. <span>{{something}}</span>
  4. <span v-show="isShow">son发来贺电:{{toBStr}}</span>
  5. <button class="f-btn">点击发送信息给son</button>
  6. </JuniorSon>

兄弟组件互传信息

其中一个兄弟组件将信息先传递给父组件,再通过父组件将信息传递给另有一个兄弟组件

父组件

  1. <template>
  2. <!-- : v-bind: 的语法糖 使用后属性就可以直接使用变量了 -->
  3. <!-- 传递给子组件的信息不能是自定义属性,这样子组件的props不能获取到传递的信息,但可以通过this.$attrs获取到自定义属性信息 -->
  4. <JuniorSon @results = "accept" class="son" :index = 'infos' item = 'haha'>
  5. <span>{{something}}</span>
  6. <span v-show="isShow">son发来贺电:{{toBStr}}</span>
  7. <button class="f-btn">点击发送信息给son</button>
  8. </JuniorSon>
  9. </template>
  10. <script>
  11. import JuniorSon from './JuniorSon.vue';
  12. export default {
  13. components:{
  14. JuniorSon
  15. },
  16. data() {
  17. return {
  18. something:'我是你爸爸',
  19. infos:'我是你爸爸,我有钱。哎╮(╯_╰)╭',
  20. // 存放son传递过来的数据
  21. sonData:[],
  22. isShow:false
  23. }
  24. },
  25. methods:{
  26. // 通过自定义事件接收juniorSon发送的信息
  27. accept:function(event) {
  28. // 打印信息
  29. console.log(event,arguments)
  30. // 将信息存入sonData
  31. const list = Array.from(arguments);
  32. list.forEach(item => {
  33. this.sonData.push(item);
  34. })
  35. // 接收并显示信息
  36. this.isShow = true
  37. }
  38. },
  39. computed:{
  40. toBStr:function(){
  41. let str = '';
  42. this.sonData.forEach(item => {
  43. str += item + ' ';
  44. })
  45. return str;
  46. }
  47. }
  48. }
  49. </script>
  50. <style>
  51. /* 设置组件的样式 */
  52. .son {
  53. width: 100%;
  54. display: flex;
  55. flex-direction: column;
  56. align-content: center;
  57. justify-content: center;
  58. }
  59. span {
  60. width: 200px;
  61. }
  62. .f-btn {
  63. margin: 20px 0;
  64. width: 200px;
  65. }
  66. </style>

子组件

  1. <template>
  2. <div class="aBody">
  3. <!-- 插槽让组件的标签可以些内容,这些内容将放到slot -->
  4. <slot></slot>
  5. <span class="title">我,子组件。</span>
  6. <!-- 通过v-ifv-show的方式让标签消失出现 -->
  7. <!-- 前者是删除,后者是隐藏 -->
  8. <span class="info" v-show="isShow">{{title}}</span>
  9. <span class="info" v-if="isShow">father发来亲切的问候:{{index}}</span>
  10. <!-- btn添加点击事件 @ v-on: 的语法糖-->
  11. <button class="btn" @click="changeInfo">展示info</button>
  12. <button class="f-btn" @click="sendInfoToFather">点击发送信息给father</button>
  13. </div>
  14. </template>
  15. <script>
  16. export default {
  17. //
  18. // props: ["index","item"],
  19. //
  20. props:{
  21. index:{
  22. type:String,
  23. required:true
  24. },
  25. item:{
  26. type:String,
  27. required:true
  28. }
  29. },
  30. data(){
  31. // 必须有返回值,且返回一个对象
  32. // 返回的是一个vue的对象,所以里面的变量可以是用, this.xxx获取
  33. return {
  34. title:'',
  35. isShow:false
  36. }
  37. },
  38. methods:{
  39. changeInfo:function() {
  40. this.title = '啊被发现了吗! ,,ԾㅂԾ,,';
  41. // 点击后将isShow取反后的值赋值给他自己,以实现通过点击然一个标签消失,出现
  42. this.isShow = !this.isShow;
  43. // 获取信息
  44. console.log(this.$attrs)
  45. console.log(this.$props)
  46. console.log(this.index,this.item)
  47. },
  48. // 将信息发送给SeniorFather
  49. sendInfoToFather: function() {
  50. // 参数1---父子间中,使用子组件时定义的自定义事件的事件处理函数
  51. // 参数2,3,4---传递参数
  52. this.$emit('results','你是个大帅逼','没错说的就是你','big SB',)
  53. }
  54. }
  55. }
  56. </script>
  57. <style>
  58. .info ,.title {
  59. width: 200px;
  60. }
  61. .btn {
  62. width: 200px;
  63. }
  64. .f-btn {
  65. width: 200px;
  66. margin-top: 20px;
  67. }
  68. </style>