Vue商城项目02

改造新闻的路由链接

  1. 把a链接改成router-link
<router-link to="/home/newslist">
<div class="mui-media-body">新闻资讯</div>
</router-link>
  1. 匹配路由
import NewsList from './components/news/NewsList.vue'

{ path: '/home/newslist', component: NewsList }

新闻资讯 页面 制作

  1. 绘制界面, 使用 MUI 中的 media-list.html,拷贝代码,注意图片路径
    若两个span想要左右对齐,可以css3
      display: flex;
      justify-content: space-between;
  1. 使用 vue-resource 获取数据
    在main.js里Vue.use(VueResource)的后面设置请求的根路径
    Vue.http.options.root = ‘http://vue.studyit.io’;
<script>
import { Toast } from "mint-ui";

export default {
  data() {
    return {
      newslist: [] // 新闻列表
    };
  },
  created() {
    this.getNewsList();
  },
  methods: {
    getNewsList() {
      // 获取新闻列表
      this.$http.get("api/getnewslist").then(result => {
        if (result.body.status === 0) {
          // 如果没有失败,应该把数据保存到 data 上
          this.newslist = result.body.message;
        } else {
          Toast("获取新闻列表失败!");
        }
      });
    }
  }
};
</script>
  1. 渲染真实数据
      <li class="mui-table-view-cell mui-media" v-for="item in newslist" :key="item.id">
        <router-link :to="'/home/newsinfo/' + item.id">
          <img class="mui-media-object mui-pull-left" :src="item.img_url">
          <div class="mui-media-body">
            <h1>{{ item.title }}</h1>
            <p class='mui-ellipsis'>
              <span>发表时间:{{ item.add_time | dateFormat }}</span>
              <span>点击:{{item.click}}次</span>
            </p>
          </div>
        </router-link>
      </li>

  1. 时间格式化
    cnpm i moment -S
    在Main.js里
// 导入格式化时间的插件
import moment from 'moment'
// 定义全局的过滤器
Vue.filter('dateFormat', function (dataStr, pattern = "YYYY-MM-DD HH:mm:ss") {
  return moment(dataStr).format(pattern)
})

实现 新闻资讯列表 点击跳转到新闻详情

  1. 把列表中的每一项改造为 router-link,同时,在跳转的时候应该提供唯一的Id标识符
  2. 创建新闻详情的组件页面 NewsInfo.vue
  3. 在 路由模块中,将 新闻详情的 路由地址 和 组件页面对应起来
    import NewsInfo from ‘./components/news/NewsInfo.vue’
    { path: ‘/home/newsinfo/:id’, component: NewsInfo }

实现 新闻详情 的 页面布局 和数据渲染

this.$route.params来获取路由中的参数:

<script>
// 1. 导入 评论子组件
import comment from "../subcomponents/comment.vue";

export default {
  data() {
    return {
      id: this.$route.params.id, // 将 URL 地址中传递过来的 Id值,挂载到 data上,方便以后调用
      newsinfo: {} // 新闻对象
    };
  },
  created() {
    this.getNewsInfo();
  },
  methods: {
    getNewsInfo() {
      // 获取新闻详情
      this.$http.get("api/getnew/" + this.id).then(result => {
        if (result.body.status === 0) {
          this.newsinfo = result.body.message[0];
        } else {
          Toast("获取新闻失败!");
        }
      });
    }
  },
  components: {
    // 用来注册子组件的节点
    "comment-box": comment
  }
};
</script>

如果页面里的图片不能完整显示,需要

单独封装一个 comment.vue 评论子组件

  1. 先创建一个 单独的 comment.vue 组件模板
    main.js
//按需导入 Mint-UI 中的组件
import { Header, Swipe, SwipeItem, Button } from 'mint-ui'
Vue.component(Button.name, Button)

组件里<mt-button type="primary" size="large">发表评论</mt-button>
样式里:缩进两个文字 text-indent: 2em;

  1. 在需要使用 comment 组件的 页面中,先手动 导入 comment 组件,在script里
  • import comment from "../subcomponents/comment.vue";
  1. 在父组件中,使用 components 属性,将刚才导入 comment 组件,注册为自己的 子组件
  components: {
    // 用来注册子组件的节点
    "comment-box": comment
  }
  1. 将注册子组件时候的,注册名称,以 标签形式,在页面中 引用即可
    //父组件向子组件传值
    <comment-box :id="this.id"></comment-box>

获取所有的评论数据显示到页面中 实现点击加载更多评论的功能

  1. 为加载更多按钮,绑定点击事件,在事件中,请求 下一页数据
    <mt-button type="danger" size="large" plain @click="getMore">加载更多</mt-button>
  2. 点击加载更多,让 pageIndex++ , 然后重新调用 this.getComments() 方法重新获取最新一页的数据
  3. 为了防止 新数据 覆盖老数据的情况,我们在 点击加载更多的时候,每当获取到新数据,应该让 老数据 调用 数组的 concat 方法,拼接上新数组
<template>
    <div class="cmt-list">
      <div class="cmt-item" v-for="(item, i) in comments" :key="item.add_time">
        <div class="cmt-title">
          第{{ i+1 }}楼&nbsp;&nbsp;用户:{{ item.user_name }}&nbsp;&nbsp;发表时间:{{ item.add_time | dateFormat }}
        </div>
        <div class="cmt-body">
            <!-- 如果值为 undefined 则输出此  '此用户很懒,嘛都没说' -->
          {{ item.content === 'undefined' ? '此用户很懒,嘛都没说': item.content }}
        </div>
      </div>
    </div>
<template>

<script>
import { Toast } from "mint-ui";
export default {
  data() {
    return {
      pageIndex: 1, // 默认展示第一页数据
      comments: [] // 所有的评论数据数组
    };
  },
  created() {
    this.getComments();
  },
  methods: {
    getComments() {
      // 获取评论
      this.$http
        .get("api/getcomments/" + this.id + "?pageindex=" + this.pageIndex)
        .then(result => {
          if (result.body.status === 0) {
            // this.comments = result.body.message;
            // 每当获取新评论数据的时候,不要把老数据清空覆盖,而是应该以老数据,拼接上新数据
            this.comments = this.comments.concat(result.body.message);
          } else {
            Toast("获取评论失败!");
          }
        });
    },
    getMore() {
      // 加载更多
      this.pageIndex++;
      this.getComments();
    }
  },
  //父组件向子组件传值
  props: ["id"]
};
</script>
发布了59 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41160739/article/details/104576922