article-detail.vue 1.78 KB
<template>
  <div class="article">
    <ArticleBar class="header" @on-close="onClose"></ArticleBar>

    <ArticleBody ref="body" class="body"></ArticleBody>

    <ArticleFooter class="footer"
       v-if="articleDetail"
       v-bind="articleDetail.footer"
       @on-comment-click="onCommentClick"
       @on-close="onClose">
    </ArticleFooter>
  </div>
</template>

<script>

import ArticleBar from './article-bar';
import ArticleFooter from './article-footer';
import ArticleBody from './article-body';
import { createNamespacedHelpers } from 'vuex';

const { mapActions, mapState, mapMutations } = createNamespacedHelpers('article');

export default {
  name: 'ArticleDetail',
  components: {
    ArticleBar,
    ArticleBody,
    ArticleFooter,
  },
  data() {
    return {
      articleId: 0,
      grassId: 0
    };
  },
  mounted() {
  },
  methods: {
    onCommentClick() {
      this.$router.push({
        name: 'article.comment',
        params: {
          articleId: this.grassId
        }
      });
    },
    ...mapActions(['getDetail']),
    ...mapMutations({
      fetchArticleDetail: 'FETCH_GUANG_SUCCESS'
    }),
    fetch(params) {
      this.articleId = params.articleId;
      this.grassId = params.grassId;

      return this.getDetail({
        article_id: params.articleId,
        grass_id: params.grassId
      });
    },
    onClose() {
      this.reset();
      this.$emit('on-close');
    },
    reset() {
      this.fetchArticleDetail({});
    }
  },
  computed: {
    ...mapState(['articleDetail'])
  }
};
</script>

<style lang="scss" scoped>

.article {
  width: 100%;
  height: 100vh;
  display: flex;
  flex-direction: column;

  .header {
    // pass
  }

  .body {
    flex: 1;
    overflow: auto;
    -webkit-overflow-scrolling: touch;
  }

  .footer {
    // pass
  }
}
</style>