第一次用webpack配置vue和element-ui的项目

8 篇文章 0 订阅


项目github地址: github项目地址

项目中遇到的问题

tips:如何将github上其他人的项目在本地运行
错误提示:‘webpack-dev-server’ 不是内部或外部命令,也不是可运行的程序
npm install webpack-dev-server -g
npm install
npm run dev

关于prop的父级像子组件传值

父级页面

定义子组件
<play ref="palySong" :songInfo="palySongInfo"></play>
//其中ref是用来定义调用子组件的方法。:songInfo是作为父级传递给子组件的数据,子组件里需要用prop来接收才能完成传参的操作
import play from "../playSong/play"
//从play页面把组件拿出来
export default{
	data(){
		return{
			palySongInfo:[
				{
					id:"0",
					name:"songName",
					author:"songAuthor"
				}]
		}
	},
	methods:{
		paly(){
			this.$refs.palySong.show();//调用子组件的show方法
		}
	},
	components:{
    	play : play // 注册子页面play组件
    }
}

子组件页面 /playSong/play.vue

<template>
	<div class="playSong" v-show="isPlay" >
		<p class="songName">{{songInfo.name}}</p>
		<span class="songAuthor">{{songInfo.author}}&gt;</span>
	</div>
</template>
<script>
	export default{
		data(){
			return{
				isPlay:false
			}
		},
		methods:{
			show(){
				this.isPlay=true;//将状态改变为true。直接控制组件的显示状态	
			}	
		},
		props:{
		//子组件接收父级页面的数据
			songInfo:{
					type:Object
				}
		}
	}
</script>

axios 传参和修改vue data数据

在vue中我们像jquery中ajax传参需要用到axios,我们需要用npm 下载axios模块。
npm install axios -s
下载完成之后需要在main.js里面引用一下
import axios from ‘axios’
在这里插入图片描述Vue.prototype.$axios = axios;后面会有提及是为了解决一个bug。
在完成引用之后,就可以开始在对应的组件里面开始使用了。
我的组件页面是在 myMusic.vue

<script>
	export default{
			data(){
					return{
						selectedSongSheet: {},//需要从接口获取数据
					}
				},
				mounted(){
					//在挂载数据的时候,当我没有在main.js里面写    Vue.prototype.$axios = axios;而是直接使用,如下例1;
					//例1:
					/*axios.get('/static/json/songSheet.json')
					  .then(function (response) {
					    console.log(response);
				  	}),
				  	.catch(function (error) {
					    console.log(error);
				  	});*/
				  	//此时会有报错 "axios is not defind" 如下图 例1-1
				  	//所以我们需要在main.js里多写一行代码。不过为什么会如此还需要再探究一下。在main.js写了 Vue.prototype.$axios = axios之后,我们继续使用axios
				  	
				  	//例2:
				  	/*this.$axios.get('/static/json/songSheet.json')
					  .then(function (response) {
					    console.log(response.data.data.collectionSongsLists);
					   this.collectionSongsLists=response.data.data.collectionSongsLists;
				  	})
				  	.catch(function (error) {
					    console.log(error);
				  	});*/
				  	//在例2中,我们会发现我们能获取到json数据了,但是却一不能对vue data里面的对应对象赋值。浏览器会有提示:TypeError: Cannot set property 'collectionSongsLists' of undefined,没有找到我们要赋值的那个在data对象,这是由于我们this的指向问题。在this.$axios里面的this不是指向vue实例。我们需要修改this的指向,使用箭头函数或者在this.$axios之前定义一下this。
				  	
				  	//例3:终于成功了
				  	var that = this ,
				  	this.$axios.get('/static/json/songSheet.json')
					  .then(function (response) {
					    console.log(response.data.data.collectionSongsLists);
					   that.collectionSongsLists=response.data.data.collectionSongsLists;
				  	})
				  	.catch(function (error) {
					    console.log(error);
				  	});
				  	
				}
		}	

</script>

图:例1-1图:例1-1

json数据获取问题

在本地新建了几个json文件,模拟调用后台接口。在调用的时候出现了以问题。
在这里插入图片描述
而且打印出来的数据也不是变成了字符串格式,用JSON.parse()转格式也会出现报错。
在这里插入图片描述
最后发现这个问题是在json文件中,不能添加/**/或者//的注释。

关于引用自定义的js,并调用里面的函数方法。

在项目中我们使用了cookie模拟后台传递的用户id用于在多个页面调用用户信息。新建一个cookie.js文件用户存放cookie的存取方法,在写这个方法的过程中需要注意,因为我们这个js是需要在vue中引用,需要调用cookie.js中定义的存取方法,所以我们需要暴露一个方法出去供调用。

cookie.js

export let cookie={
	setCookie:function(cname,cvalue,exdays){
	    var d = new Date();
	    d.setTime(d.getTime()+(exdays*24*60*60*1000));
	    var expires = "expires="+d.toGMTString();
	    document.cookie = cname+"="+cvalue+"; "+expires;
	},
	getCookie:function(cname){
	    var name = cname + "=";
	    var ca = document.cookie.split(';');
	    for(var i=0; i<ca.length; i++) {
	        var c = ca[i].trim();
	        if (c.indexOf(name)==0) { return c.substring(name.length,c.length); }
	    }
	    return "";
	}
	/*保存cookie 模拟用户登录*/
	//初步保存一个cookie值。模拟缓存的用户信息
}

我们在页面调用之后就可以用 cookie.setCookie()来调用了。
在vue组件页面我们用require调用。

<script>
	let cookie = require("../../../static/js/cookie.js");
	cookie.cookie.setCookie("userId",0);//存cookie
	cookie.cookie.getCookie("userId");//取cookie
</script>

到此,我们引用就已经完成了。

关于子路由

在页面中我们包含三个选项卡,选项卡中内容较为复杂。所以采取了子路由的方式来做
在这里插入图片描述
在这里插入图片描述
about(关于我),dynamic(动态),userSongs(音乐)。这三个页面作为user页面的选项卡的内容。我们需要在user页面(父页面)里面加入。用来接收子路由组件的东西。
我们还需要在index.js里面修改vue页面的路由配置

在这里插入图片描述
配置子路由
在这里插入图片描述
在children中,配置的第一个path:’’,配置的是默认选项卡展示的内容,我们这里默认展示的模块是userSong。

el-row上绑定的事件的失效

我们在项目中当使用element-ui和vue的时候,常使用element-ui的组件和vue的路由。但是在使用的时候还是需要注意到一些小坑,我稍微总结一下我所遇到的小坑:
1,el-row ,在使用el-row ,el-col 的时候,如果我们将事件绑定在el-row上面的时候,会发现我们定义的事件失效了。而且注意的是在el-row和el-col之间我们应该尽量避免插入其他标签。我们为保证事件的有效,可以在el-row外用一个div容器包裹。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值