vue学习篇2之数据存储与组件间通信

一、存储数据文件

当前操作的数据在刷新或关闭浏览器之后,需要数据还是当前的数据,就要缓存数据。
存储有两方面:1.缓存在内存。2.缓存为文件。
存在内存的话浏览器关闭后会没有,而文件不会
localStorage本地存储,存储为文件。
存储需要知道存的什么东西?什么时候存?什么时候读?
1).存界面想要展示的数据
2).只要界面的数据发生了改变时刻存。(比如删除、添加、修改等等)
3).一上来显示就要读,一打开就要读

data () {
  return {
    //从localStorage读取数据
    todos: JSON.parse(window.localStorage.getItem('todos_key') || '[]')
    //localStorage存的时候以一个key对应一个value的形式存的,而且存的是文本字符串,拿到数据后要转换为数组,没有值就解析'[]'
  }
}

当数据发生改变就需要存储,需要用到深度监视,监视数据的改变。为什么需要深度监视呢?因为只要内部发生变化都可以知道,而一般监视只能监视最外层。

watch: {
  todos: {
    deep: true,
    handler: function(newValue, oldValue) {
      //将todos最新值的json格式字符串,保存到localStorage里。todos_key是键,键可以随便命名,但存的键和取的键名字一定要一致,存的值也必须是转换为json字符串
      window.localStorage.setItem('todos_key', JSON.stringify(newValue))
    }
  }
}
二、组件间通信

1、props
父组件

<div>
 //引入的子组件
  <CommentHead :data='data' :addClick='addClick'></CommentHead>
</div>
export default{
  data () {
    return {
      data: [{a: 1}, {b: 2}]
    }
  },
  methods: {
    addClick(obj){
      this.data=this.data.push(obj)
    }
  }
}

子组件里接收父组件传过来的数据与方法

export default{
  props:{
    data: Array,
    addClick: Function
  },
  methods:{
    addItem(){
      let obj={c:3}
      this.addClick(obj)
    }
  }
}

2、vue的自定义事件
自定义事件有两方面:1.父组件绑定监听。2.子组件触发(分发)事件。
绑定监听有两种方法:
方法一:

//父组件
<div>
  //给CommentHead组件绑定addClick事件监听
  <CommentHead @addClick='addClick'></CommentHead>
</div>

methods:{
  addClick(obj){
    this.data=this.data.push(obj)
  }
}


//子组件
methods:{
  addItem(){
    let obj={c:3}
    this.$emit('addClick', obj)  //子组件触发事件回调
  }
}

方法二:

//父组件
<div>
  <CommentHead ref='head'></CommentHead>
</div>

export default{
  methods:{
    addClick(obj){
      this.data=this.data.push(obj)
    }
  },
  mounted(){
    //给CommentHead组件绑定事件监听
    this.$refs.head.$on('addClick', this.addClick)
  }
}

//子组件
methods:{
  addItem(){
    let obj={c:3}
    this.$emit('addClick', obj)  //子组件触发事件回调
  }
}

自定义事件专门用于父子组件之间传递,用来代替函数属性。不适合父组件里有子组件,子组件里还有子组件的这种多层嵌套。

3、slot插槽(占位)
用于父组件像子组件传递标签数据。

//子组件
<template>
  <div>
    <slot name='head'>不确定的标签结构1</slot>
    <slot name='content'>不确定的标签结构2</slot>
  </div>
</template>
//name属性表示占位之间的唯一标识名字

//父组件
<div>
  //引入子组件
  <child>
    <div>
      <div slot='head'>head对应的标签数据</div>
      <div slot='content'>content对应的标签数据</div>
    </div>
  </child>
</div>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容