粗糙实现一个类 Vuex 的 Store 状态管理器

发布于 2024-11-15 06:46:19 字数 8160 浏览 3 评论 0

未统一管理组件状态时

项目目录结构:

src
  - components
    - NewsDetail.vue
    - NewsList.vue
  - App.vue
  - main.js

main.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import App from './App.vue'

// 安装插件
Vue.use(VueRouter)

// 设置不需要在控制台中打印当前处于开发环境下的消息
Vue.config.productionTip = false

// 创建 Vue 实例,并挂载 Vue 组件
new Vue({
  render: h => h(App),
}).$mount('#app')

App.vue

<template>
  <div>
    <router-view/>
  </div>
</template>

<script>
  import VueRouter from 'vue-router'
  import NewsList from './components/NewsList'
  import NewsDetail from './components/NewsDetail'

  const router = new VueRouter({
    routes: [
      { path: '/', component: NewsList},
      { path: '/news/:id', component: NewsDetail }
    ]
  })

  export default {
    name: 'App',
    router
  };
</script>

<style>
  #app {
    font-family: Avenir, Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
    margin-top: 60px;
  }
</style>

NewsList.vue

<template>
  <div>
    <dl>
      <dt>新闻列表</dt>
      <dd v-for="news in newsList" :key="news.id">
        <router-link :to="'/news/' + news.id">
          {{ news.id }} - {{ news.title }}
        </router-link>
      </dd>
    </dl>
  </div>
</template>

<script>
  export default {
    name: 'NewsList',
    data() {
      return {
        newsList: []
      }
    },
    created() {
      this.loadNews()
    },
    methods: {
      loadNews() {
        const newsData = [
          { id: 101, title: 'TikTok 用什么算法传输并加密内容?', content: '最近,美国计划让微软收购视频分享社交网络移动应用 TikTok,因为“它对美国国家安全构成了风险”,必须交由美国本土的科技公司管理。TikTok 最近得到了多家媒体的报道,但其中又有多少是真实的呢?每篇文章都会回答一个非常具体的问题。现在,是时候把事实重新摆回桌面了。' },
          { id: 102, title: '【Kafka】生产者客户端小结(java)', content: 'KafkaProducer 中一般会发生两种类型的异常:可重试的异常和不可重试的异常。常见的可重试异常有:NetworkException、LeaderNotAvailableException、UnknownTopicOrPartitionException、NotEnoughReplicasException、NotCoordinatorException 等。比如 NetworkException 表示网络异常,这个有可能是由于网络瞬时故障而导致的异常,可以通过重试解决;又比如 LeaderNotAvailableException 表示分区的 leader 副本不可用,这个异常通常发生在 leader 副本下线而新的 leader 副本选举完成之前,重试之后可以重新恢复。不可重试的异常,比如 RecordTooLargeException 异常,暗示了所发送的消息太大,KafkaProducer 对此不会进行任何重试,直接抛出异常。' }
        ]

        this.newsList = newsData
      }
    }
  };
</script>

<style scoped>

</style>

NewsDetail.vue

<template>
  <div>
    <h3>
      {{ newsDetail.title }}
    </h3>
    <div>
      {{ newsDetail.content }}
    </div>
    <div>
      <router-link to="/">返回新闻列表</router-link>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'NewsDetail',
    data() {
      return {
        newsDetail: {}
      }
    },
    created() {
      this.loadNews()
    },
    methods: {
      loadNews() {
        const newsData = [
          { id: 101, title: 'TikTok 用什么算法传输并加密内容?', content: '最近,美国计划让微软收购视频分享社交网络移动应用 TikTok,因为“它对美国国家安全构成了风险”,必须交由美国本土的科技公司管理。TikTok 最近得到了多家媒体的报道,但其中又有多少是真实的呢?每篇文章都会回答一个非常具体的问题。现在,是时候把事实重新摆回桌面了。' },
          { id: 102, title: '【Kafka】生产者客户端小结(java)', content: 'KafkaProducer 中一般会发生两种类型的异常:可重试的异常和不可重试的异常。常见的可重试异常有:NetworkException、LeaderNotAvailableException、UnknownTopicOrPartitionException、NotEnoughReplicasException、NotCoordinatorException 等。比如 NetworkException 表示网络异常,这个有可能是由于网络瞬时故障而导致的异常,可以通过重试解决;又比如 LeaderNotAvailableException 表示分区的 leader 副本不可用,这个异常通常发生在 leader 副本下线而新的 leader 副本选举完成之前,重试之后可以重新恢复。不可重试的异常,比如 RecordTooLargeException 异常,暗示了所发送的消息太大,KafkaProducer 对此不会进行任何重试,直接抛出异常。' }
        ]

        const newsId = this.$route.params.id

        newsData.forEach(news => {
          if (news.id === +newsId) {
            this.newsDetail = news
          }
        })
      }
    }
  };
</script>

<style scoped>

</style>

统一管理组件状态后

目录结构:

src
  - components
    - NewsDetail.vue
    - NewsList.vue
  - store
    - index.js
  - App.vue
  - main.js

store/index.js

export default {
  state: {
    newsList: [],
    newsDetail: {}
  },
  updateState(stateName, stateVal) {
    this.state[stateName] = stateVal

    // 打印日志
    console.log(`更新${ stateName }的值为:${ JSON.stringify(stateVal) }`)
  }
}

main.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import App from './App.vue'
import Store from './store'

// 添加 Vue 实例变量
Vue.prototype.$store = Store

// 安装插件
Vue.use(VueRouter)

// 设置不需要在控制台中打印当前处于开发环境下的消息
Vue.config.productionTip = false

// 创建 Vue 实例,并挂载 Vue 组件
new Vue({
  render: h => h(App),
}).$mount('#app')

NewsList.vue

<template>
  <div>
    <dl>
      <dt>新闻列表</dt>
      <dd v-for="news in this.$store.state.newsList" :key="news.id">
        <router-link :to="'/news/' + news.id">
          {{ news.id }} - {{ news.title }}
        </router-link>
      </dd>
    </dl>
  </div>
</template>

<script>
  export default {
    name: 'NewsList',
    data() {
      return {
        // newsList: []
      }
    },
    created() {
      this.loadNews()
    },
    methods: {
      loadNews() {
        const newsData = [
          { id: 101, title: 'TikTok 用什么算法传输并加密内容?', content: '最近,美国计划让微软收购视频分享社交网络移动应用 TikTok,因为“它对美国国家安全构成了风险”,必须交由美国本土的科技公司管理。TikTok 最近得到了多家媒体的报道,但其中又有多少是真实的呢?每篇文章都会回答一个非常具体的问题。现在,是时候把事实重新摆回桌面了。' },
          { id: 102, title: '【Kafka】生产者客户端小结(java)', content: 'KafkaProducer 中一般会发生两种类型的异常:可重试的异常和不可重试的异常。常见的可重试异常有:NetworkException、LeaderNotAvailableException、UnknownTopicOrPartitionException、NotEnoughReplicasException、NotCoordinatorException 等。比如 NetworkException 表示网络异常,这个有可能是由于网络瞬时故障而导致的异常,可以通过重试解决;又比如 LeaderNotAvailableException 表示分区的 leader 副本不可用,这个异常通常发生在 leader 副本下线而新的 leader 副本选举完成之前,重试之后可以重新恢复。不可重试的异常,比如 RecordTooLargeException 异常,暗示了所发送的消息太大,KafkaProducer 对此不会进行任何重试,直接抛出异常。' }
        ]

        // this.newsList = newsData
        this.$store.updateState('newsList', newsData)
      }
    }
  };
</script>

<style scoped>

</style>

NewsDetail.vue

  <template>
    <div>
      <h3>
        {{ this.$store.state.newsDetail.title }}
      </h3>
      <div>
        {{ this.$store.state.newsDetail.content }}
      </div>
      <div>
        <router-link to="/">返回新闻列表</router-link>
      </div>
    </div>
  </template>

  <script>
    export default {
      name: 'NewsDetail',
      data() {
        return {
          // newsDetail: {}
        }
      },
      created() {
        this.loadNews()
      },
      methods: {
        loadNews() {
          const newsData = [
            { id: 101, title: 'TikTok 用什么算法传输并加密内容?', content: '最近,美国计划让微软收购视频分享社交网络移动应用 TikTok,因为“它对美国国家安全构成了风险”,必须交由美国本土的科技公司管理。TikTok 最近得到了多家媒体的报道,但其中又有多少是真实的呢?每篇文章都会回答一个非常具体的问题。现在,是时候把事实重新摆回桌面了。' },
            { id: 102, title: '【Kafka】生产者客户端小结(java)', content: 'KafkaProducer 中一般会发生两种类型的异常:可重试的异常和不可重试的异常。常见的可重试异常有:NetworkException、LeaderNotAvailableException、UnknownTopicOrPartitionException、NotEnoughReplicasException、NotCoordinatorException 等。比如 NetworkException 表示网络异常,这个有可能是由于网络瞬时故障而导致的异常,可以通过重试解决;又比如 LeaderNotAvailableException 表示分区的 leader 副本不可用,这个异常通常发生在 leader 副本下线而新的 leader 副本选举完成之前,重试之后可以重新恢复。不可重试的异常,比如 RecordTooLargeException 异常,暗示了所发送的消息太大,KafkaProducer 对此不会进行任何重试,直接抛出异常。' }
          ]

          const newsId = this.$route.params.id

          newsData.forEach(news => {
            if (news.id === +newsId) {
              // this.newsDetail = news
              this.$store.updateState('newsDetail', news)
            }
          })
        }
      }
    };
  </script>

  <style scoped>

  </style>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

梦幻之岛

暂无简介

0 文章
0 评论
25 人气
更多

推荐作者

一梦浮鱼

文章 0 评论 0

mb_Z9jVigFL

文章 0 评论 0

伴随着你

文章 0 评论 0

耳钉梦

文章 0 评论 0

18618447101

文章 0 评论 0

蜗牛

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文