改造新闻的路由链接
- 把a链接改成router-link
<router-link to="/home/newslist">
<div class="mui-media-body">新闻资讯</div>
</router-link>
- 匹配路由
import NewsList from './components/news/NewsList.vue'
{ path: '/home/newslist', component: NewsList }
新闻资讯 页面 制作
- 绘制界面, 使用 MUI 中的 media-list.html,拷贝代码,注意图片路径
若两个span想要左右对齐,可以css3
display: flex;
justify-content: space-between;
- 使用 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>
- 渲染真实数据
<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>
- 时间格式化
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)
})
实现 新闻资讯列表 点击跳转到新闻详情
- 把列表中的每一项改造为 router-link,同时,在跳转的时候应该提供唯一的Id标识符
- 创建新闻详情的组件页面 NewsInfo.vue
- 在 路由模块中,将 新闻详情的 路由地址 和 组件页面对应起来
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 评论子组件
- 先创建一个 单独的 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;
- 在需要使用 comment 组件的 页面中,先手动 导入 comment 组件,在script里
import comment from "../subcomponents/comment.vue";
- 在父组件中,使用
components
属性,将刚才导入 comment 组件,注册为自己的 子组件
components: {
// 用来注册子组件的节点
"comment-box": comment
}
- 将注册子组件时候的,注册名称,以 标签形式,在页面中 引用即可
//父组件向子组件传值<comment-box :id="this.id"></comment-box>
获取所有的评论数据显示到页面中 实现点击加载更多评论的功能
- 为加载更多按钮,绑定点击事件,在事件中,请求 下一页数据
<mt-button type="danger" size="large" plain @click="getMore">加载更多</mt-button>
- 点击加载更多,让 pageIndex++ , 然后重新调用 this.getComments() 方法重新获取最新一页的数据
- 为了防止 新数据 覆盖老数据的情况,我们在 点击加载更多的时候,每当获取到新数据,应该让 老数据 调用 数组的 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 }}楼 用户:{{ item.user_name }} 发表时间:{{ 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>