Vue商城项目02

vue

改造新闻的路由链接

  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>

以上是 Vue商城项目02 的全部内容, 来源链接: utcz.com/z/379387.html

回到顶部