• vue2.0 仿手机新闻站(六)详情页制作


    1.结构

    2.配置详情页路由

    router.config.js

    /**
     * 配置 路由
     */
    // 导入组件
    import Home from './components/Home.vue'
    import Follow from './components/Follow.vue'
    import Column from './components/Column.vue'
    import UserInfo from './components/UserInfo.vue'
    import Article from './components/Article.vue'
    
    // 导出路由数组
    export default [
    	{ // 首页
    		path:'/home',
    		component:Home
    	},
    	{ // 关注页
    		path:'/follow',
    		component:Follow
    	},
    	{ // 栏目页
    		path:'/column',
    		component:Column
    	},
    	{ // 我的页
    		path:'/user-info',
    		component:UserInfo
    	},
    	{ // 文章详情页
    		path:'/article/:id',
    		component:Article
    	},
    	{ // 配置默认路由
    		path:'/',
    		redirect:'/home' // 路由重定向
    	},
    	{
    		path:'*',
    		redirect:'/home' // 路由重定向
    	}
    ]

    3.通过 router-link路由 跳转详情页

    Home.vue

    <!-- 首页 -->
    <template>
    	<div id="home">
    		<div class="content mt30">
    			<div class="newsList">
    				<ul>
    					<li v-for="(item,index) in arrList">
    						<!-- 通过 router-link路由 跳转详情页 -->
    						<router-link :to="'/article/'+item.id">
    							<h2>{{index}}.{{item.title}}</h2>
    							<p>{{item.detail}}</p>
    						</router-link>
    					</li>
    				</ul>
    			</div>
    		</div>
    	</div>
    </template>
    
    <script>
    	export default{
    		data(){
    			return {
    				arrList:[]
    			}
    		},
    		mounted(){
    			// 获取数据
    			this.fetchData();
    		},
    		methods:{
    			fetchData(){
    				var _this = this;
    				// this 为 vue的实例
    				this.$http.get('src/data/index.data').then(function(res){
    					_this.arrList = res.data;
    				}).catch(function(err){
    					console.log('Home',err);
    				});
    			}
    		}
    	}
    </script>
    
    <style scoped>
    	.mt30{
    		margin-top: 30px;
    	}
    </style>
    

    4.通过 正则 获取 path 中的 id, 并 通过 id 获取该详情页信息

    Article.vue

    <!-- 文章详情页 -->
    <template>
    	<div id="article">
    		<div class="nav">
    			<ul>
    				<li class="l-btn" onclick="window.history.go(-1)"></li>
    			</ul>
    		</div>
    		<!-- 内容部分 -->
    		<div class="content">
    			<div class="header clear">
    				<h2><img :src="articleData.author_face" alt="" /></h2>
    				<p>百度</p>
    			</div>
    			<div class="cont">
    				<h3>{{articleData.title}}</h3>
    				<div class="time">
    					<p>{{articleData.time}}<span><img src="../assets/img/zan.png" alt="" /></span></p>
    				</div>
    				<div class="text-box" v-html="articleData.content"></div>
    			</div>
    		</div>
    		<!-- 底部 -->
    		<div class="foot-btn">
    			<ul>
    				<li class="say"><a href="javascript:;">
    					<i></i><span>0</span>
    				</a></li>
    				<li class="zan"><a href="javascript:;">
    					<i></i><span>0</span>
    				</a></li>
    				<li class="xing"><a href="javascript:;">
    					<i><img src="../assets/img/xing.png" alt="" /></i>
    				</a></li>
    				<li class="fx"><a href="javascript:;">
    					<i><img src="../assets/img/fx.png" alt="" /></i>
    				</a></li>
    			</ul>
    		</div>
    	</div>
    </template>
    
    <script>
    	export default{
    		data(){
    			return{
    				// articleData 是个json
    				articleData:{}
    			}
    		},
    		mounted(){
    			// console.log(this.$route.path); 例如: /article/1
    			// 获取 path 中的id
    			var reg = //article/(d+)/;
    			var id = this.$route.path.match(reg)[1];
    			console.log(id);
    			this.fetchData(id);
    		},
    		methods:{
    			fetchData(id){
    				var _this = this;
    				this.$http.get('../src/data/article.data').then(function(res){
    					_this.articleData = res.data[id];
    				}).catch(function(err) {
    					console.log('文章详情页',err);
    				})
    			}
    		}
    	}
    </script>
    
    <style scoped>
    	html,body{ overflow-x: hidden; }
    	.nav{100%; position:fixed;top:0;left:0; background:#fff; border-bottom:1px solid #e8eaec; z-index:99;}
    	.nav ul{6.4rem;height:0.45rem; padding-top:0.15rem; margin:0 auto;}
    	.nav ul li{0.29rem;height:0.31rem; background:url(../assets/img/history.png) no-repeat 0 0; background-size:100%; margin:0 0 0 0.38rem;}
    	
    	.content{max-6.4rem; margin:0 auto; margin-top:0.6rem; background:#f2f4f5; padding-bottom:0.85rem;}
    	.content .header{ padding:0.39rem 0.28rem 0.15rem 0.28rem; height:auto; background: none}
    	.header h2{ float:left; margin-right:0.18rem;}
    	.header p{ float:left; margin-top:0.18rem; font-size:0.3rem;}
    	
    	.content .cont{ padding:0 0.38rem; color:#494d4d;}
    	.cont h3{ font-size:0.4rem; line-height:0.6rem; padding-bottom:0.25rem; border-bottom:1px solid #494d4d;}
    	.cont .time{height:0.24rem; line-height:0.24rem; margin:0.26rem 0; }
    	.time p{ float:left;position:relative;}
    	.time span{0.33rem;height:0.32rem; position:absolute; top:-0.02rem;right:-0.35rem;}
    	.time span img{100%;height:100%;}
    	
    	.cont .text-box{ font-size:0.25rem;}
    	.text-box p{ line-height:0.45rem; margin-bottom:0.1rem;}
    	.foot-btn{100%;height:0.8rem; background:#fff; border-top:1px solid #e8eaec; position:fixed; left:0;bottom:0;}
    	.foot-btn ul{6.4rem; margin:0 auto;height:0.52rem; margin-top:0.16rem;}
    	.foot-btn ul li{ float:left;}
    	.foot-btn ul li a{100%;height:100%; display:block;}
    	.foot-btn ul .say{2.03rem;height:0.52rem; border-right:1px solid #e8eaec;}
    	.say i{0.36rem;height:0.26rem; background:url(../assets/img/say.png) no-repeat 0 0; background-size:100%; float:left; margin-left:0.7rem; margin-top:0.13rem;}
    	.say span{height:0.26rem; float:left; line-height:0.26rem; margin-left:0.16rem; margin-top:0.13rem;}
    	.foot-btn ul .zan{1.86rem;height:0.52rem; border-right:1px solid #e8eaec;}
    	.zan i{0.36rem;height:0.28rem; background:url(../assets/img/zan1.png) no-repeat 0 0; background-size:100%; float:left; margin-left:0.54rem; margin-top:0.13rem;}
    	.zan span{height:0.26rem; float:left; line-height:0.26rem; margin-left:0.16rem; margin-top:0.13rem;}
    	.foot-btn ul .xing{1.2rem;height:0.52rem; border-right:1px solid #e8eaec;}
    	.xing i{0.34rem;height:0.24rem; margin:0 auto; display:block; padding-top:0.1rem;}
    	.xing i img{100%;}
    	.foot-btn ul .fx{1.25rem;height:0.52rem;}
    	.fx i{0.33rem;height:0.08rem;display:block; margin:0 auto; padding-top:0.15rem;}
    	.fx i img{100%;}
    </style>

    5.效果图

      

  • 相关阅读:
    04.
    24
    39
    46
    72.
    21.
    logout: not found”
    Username is not in the sudoers file. This incident will be reported
    激活函数
    排序算法
  • 原文地址:https://www.cnblogs.com/crazycode2/p/7591070.html
Copyright © 2020-2023  润新知