Vue
一.脚手架(vue.cli)搭建:
1.`vue-cli`是一个脚手架工具,他们大部分都要依赖两个东西:
- node环境:很多工具的运行环境
- npm:包管理器,用于下载各种第三方库
2.安装node 下载node:https://nodejs.org/zh-cn/
3.验证安装 打开终端,查看node和npm版本,验证是否安装成功: node -v npm -v
4. 配置源地址
默认情况下,`npm`安装包时会从国外的地址下载,速度很慢,容易导致安装失败,因此需要先配置`npm`的源地址
使用下面的命令更改`npm`的源地址为淘宝源 npm config set registry http://registry.npm.taobao.org/
更改好了之后,查看源地址是否正确的被更改 npm config get registry
5. 安装vue-cli
使用下面的命令安装`vue-cli`工具 npm install -g @vue/cli
安装好之后,检查`vue-cli`是否安装成功 vue --version
6. vue-cli的使用
在终端中进入某个目录,选择一个目录,该目录将放置你的工程文件夹,在终端中进入该目录
搭建工程,使用`vue-cli`提供的命令搭建工程 vue create 工程名 注意:工程名只能出现英文、数字和短横线
7. 创建好项目之后,弹出选择框

*可选择 Router路由 Vuex


8. 运行项目


浏览器打开 http://localhost:8080/ 开始项目本地开发
9.打包项目


生成dist文件夹,可上传服务器,打开域名使用
node_modules文件(第三方库文件)不需要上传或者复制给别人,只需要打开终端,运行命令 npm install 会自动加载生成第三方库文件夹node_modules
二.开发
1.插槽,属性约束
App.vue传入内容,item.vue插槽接收并显示传入的任何东西
App.vue
<template> <div id="app"> <Item :isActive="true"> asdasdas </Item> </div> </template> <script> import Item from './components/Item.vue' export default { components:{ Item } } </script> <style scoped> #app{ width: 260px; height: 45px; } </style>
Item.vue
<template>
<div class="item" :class="{active:isActive}">
<!-- 插槽 -->
<slot></slot>
</div>
</template>
<script>
export default{
// 属性约束
// props:["isActive"],
props:{
isActive:{
type:Boolean,// 约束该属性的类型boolean,传入其他类型报错,减少开发排错时间
required:false,// 是否必填
default:false,// 如果不填默认false
}
},
};
</script>
<style scoped>
.active{
background: #e7e7e7;
}
.item{
cursor: pointer;
width: 100%;
height: 100%;
}
.item:hover{
background: #f4f4f4;
}
</style>
2.具名插槽
App.vue
<template>
<div>
<div style="width: 250px;">
<Titlemenu :isActive="select" @active="select = true">
<!-- 具名插槽 -->
<template v-slot:title>
发现频道
</template>
<template v-slot:icon>
>
</template>
</Titlemenu>
</div>
</div>
</template>
<script>
import Titlemenu from './components/Titlemenu.vue'
export default {
components:{
Titlemenu
},
data(){
return {
select:false
}
}
}
</script>
<style scoped>
#app{
width: 260px;
height: 45px;
}
</style>
Titlemenu.vue
<template>
<div class="title-menu">
<Item :isActive="isActive" @active="$emit('active')">
<div class="inner">
<div class="left">
<!-- 具名插槽 -->
<slot name="title"></slot>
</div>
<div class="right">
<!-- 具名插槽 -->
<slot name="icon"></slot>
</div>
</div>
</Item>
</div>
</template>
<script>
import Item from "./Item"
export default{
components:{
Item
},
props:{
isActive:{
type:Boolean,// 约束该属性的类型boolean,传入其他类型报错,减少开发排错时间
// required:true,// 是否必填
default:false,// 如果不填默认false
}
}
}
</script>
<style>
.left{
float: left;
color: #212121;
font-weight: 500;
}
.right{
float: right;
font-size: 12px;
color: #999;
}
.title-menu{
width: 100%;
height: 46px;
line-height: 46px;
}
.inner{
padding: 0 20px;
}
</style>
3.自定义Icon组件
父组件ChannelList.vue
<template>
<div>
<div class="channel-list" :style="{height:`${height}px`}">
<div class="item" v-for="item in channels" :key="item.id" :style="{width:`${100/col}%`}">
<Channel @active="$emit('active',item.id)" :isActive="item.id === activeId" :data="item"></Channel>
</div>
</div>
<div class="coll" @click="isShow = !isShow">
<span>{{isShow?"收起":"展开"}}</span>
<!-- 引用自定义Icon组件 -->
<Icon :type="isShow?'arrowUp':'arrowDown'" eclass="icon"></Icon>
</div>
</div>
</template>
<script>
import Channel from "/src/components/Channel.vue"
import ChannelServer from "../api/channel.js"
import Icon from "./Icon.vue"
export default{
components:{
Channel,
Icon
},
props:{
activeId:{
type:Number,
required:true,
},
col:{
type:Number,
default:2
}
},
computed:{
height(){
var rows = 3;
if(this.isShow){
rows = Math.ceil(this.channels.length / this.col);
}
return rows * 40;
},
},
data(){
return {
channels:[],
isShow:true,
}
},
async created() {
var datas = await ChannelServer.getCannel();
// es5数组筛选
this.channels = datas.filter(function(item){
return item.name !== '热门';
})
}
}
</script>
<style scoped>
.channel-list{
overflow: hidden;
transition: 0.5s;
}
.item{
float: left;
}
.coll{
clear: both;
height: 40px;
line-height: 40px;
text-align: center;
color:#999;
font-size: 14px;
cursor: pointer;
border-bottom: 1px solid #e7e7e7;
}
.icon{
font-size: 12px;
}
</style>
子组件Icon.vue
<template>
<!-- 父组件如果需要直接设置icon样式,传递eclass,不要在父组件直接控制子组件的样式 -->
<i class="iconfont" :class="[iconClass,eclass]"></i>
</template>
<script>
var map = {
arrowUp:"icon-upward",
arrowDown:"icon-arrow-down",
arrowSearch:"icon-search",
};
export default{
props:{
type:{
type:String,
required:true,
},
eclass:{
type:String,
default:"",
}
},
computed:{
iconClass(){
return map[this.type];
}
}
}
</script>
<style scoped>
/* 引入阿里巴巴矢量图个人图标样式链接 */
@import "//at.alicdn.com/t/c/font_3685248_a7dgq812656.css"
</style>
4.表单提交
<!-- prevent 阻止表单提交的默认行为 -->
<form class="search" @submit.prevent="handleSearch()">
<input />
<div class="icon" @click="handleSearch">
<Icon type="arrowSearch"></Icon>
</div>
</form>
App.vue
<template>
<div class="aside">
<div style="height: 35px;margin-bottom: 15px;">
<Search @search="handelSearch" placeholder="搜索频道"></Search>
</div>
<Titlemenu :isActive="activeId === 100" @active="activeId = 100">
<!-- 具名插槽 -->
<template v-slot:title>
发现频道
</template>
<template v-slot:icon>
>
</template>
</Titlemenu>
<ChannelList :col="2" :activeId="activeId" @active="activeId = $event"></ChannelList>
</div>
</template>
<script>
import Titlemenu from './Titlemenu.vue'
import ChannelList from './ChannelList.vue'
import Search from './Search.vue'
export default {
components:{
Titlemenu,
ChannelList,
Search
},
data(){
return {
// select:false,
activeId:100,
}
},
methods:{
handelSearch(e){
console.log(e)
}
}
}
</script>
<style scoped>
.aside{
width: 100%;
height: 100%;
overflow: auto;
}
</style>
Search.vue
<template>
<!-- prevent 阻止表单提交的默认行为 -->
<form class="search" @submit.prevent="handleSearch()">
<input v-model="searchValue" :placeholder="placeholder" />
<div class="icon" @click="handleSearch">
<Icon type="arrowSearch"></Icon>
</div>
</form>
</template>
<script>
import Icon from "./Icon.vue"
export default{
components:{
Icon
},
props:{
placeholder:{
type:String,
default:"搜索关键字",
}
},
data(){
return {
searchValue:""
}
},
methods:{
handleSearch(){
if(this.searchValue){
this.$emit("search",this.searchValue);
}
}
}
}
</script>
<style scoped>
.search{
width: 100%;
height: 100%;
box-sizing: border-box;
border-radius: 3px;
border: 1px solid #e7e7e7;
position: relative;
}
.search input{
width: 100%;
height: 100%;
border: none;
outline: none;
box-sizing: border-box;
padding: 0 15px;
}
.icon{
position: absolute;
right: 0;
top: 0;
width: 40px;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
</style>
三.相关知识
1.配置全局变量 Vue.prototype
Vue.prototype.$httpurl = "http://127.0.0.1";
------------------------------------------
浙公网安备 33010602011771号