在views文件夹创建EditLabel.vue文件,并添加路由

  1. {
  2. path: '/labels/edit',
  3. component: EditLabel
  4. },

给tags数据添加id,以方便删除操作

  1. const localStorageItemName = 'tagList';
  2. type tag = {
  3. id: string
  4. name: string
  5. }
  6. type TagListModel = {
  7. data: tag[],
  8. fetch: () => tag[],
  9. create: (name: string) => 'success' | 'duplicated', // 联合类型
  10. save: () => void
  11. }
  12. const tagListModel: TagListModel = {
  13. data: [],
  14. fetch() {
  15. this.data = JSON.parse(window.localStorage.getItem(localStorageItemName) || '[]');
  16. return this.data;
  17. },
  18. create(name) {
  19. const names = this.data.map(item => item.name)
  20. if (names.indexOf(name) >= 0) {return 'duplicated';}
  21. this.data.push({id: name, name: name});
  22. this.save();
  23. return 'success';
  24. },
  25. save() {
  26. window.localStorage.setItem(localStorageItemName, JSON.stringify(this.data));
  27. }
  28. };
  29. export default tagListModel;

实现点击标签跳转至EditLabel页面

修改EditLabel路由,添加:id占位符, id是任意起的,可以是:xxx

  1. {
  2. path: '/labels/edit/:id',
  3. component: EditLabel
  4. },

当浏览器输入http://localhost:8080/#/labels/edit/1时,则跳转至id为1的页面
使用this.$route.params.id可以获取到当前id的值

  1. created(){
  2. const id = this.$route.params.id
  3. console.log(id);
  4. }

当标签不存在时,跳转至404页面

  1. created(){
  2. const id = this.$route.params.id
  3. tagListModel.fetch()
  4. const tags = tagListModel.data
  5. const tag = tags.find(t => t.id === id)
  6. if (tag) {
  7. console.log(tag);
  8. } else {
  9. this.$router.replace('/404')
  10. }
  11. }

this.$router访问路由器, replace是替换当前不存在的地址,也可以用push方法,但是不存在的地址还在路由器中,导致无法回退
将Labels.vue中的li修改为router-link

  1. <div class="tags">
  2. <router-link class='tag'
  3. :to="`/labels/edit/${tag.id}`" v-for="tag in tags"
  4. :key="tag.id">
  5. <span>{{ tag.name }}</span>
  6. <Icon name="right"/>
  7. </router-link>
  8. </div>

将Notes改造成通用组件

添加2个props,refactor组件名为FromItem

将Button封装成通用组件

  1. <template>
  2. <button class="button" @click="$emit('click', $event)">
  3. <slot/>
  4. </button>
  5. </template>

button抛出click事件,传递给父组件

  1. <Button @click="createTag">新建标签</Button>

现在在组件上使用 v-on 只会监听自定义事件 (组件用 $emit 触发的事件)。如果要监听根元素的原生事件,可以使用 .native 修饰符,比如: