npm - 换淘宝源
Node 的模块管理器 npm 会一起安装好。由于 Node 的官方模块仓库网速太慢,模块仓库需要切换到阿里的源。
npm config set registry https://registry.npm.taobao.org/
执行下面的命令,确认是否切换成功。
npm config get registry
VUE组件说明:
1.全局组件:写在new Vue外面的组件
例:Vue.Component('标签名'),{
template:'要做成组件的HTML结构'
}
2.局部组件:写在new Vue内的组件
例:new Vue({
components:{
'组件名':{
template:'要做成组件的HTML结构'
}
}
})
组件说明:vue中的组件就是自定义标签
命名规范:驼峰命名法(coutSon)
烤串命名法(cou-son)
组件的通信:
1.父组件-->子组件
组件实例的作用域是孤立的,不能在子组件直接用父组件的数据;
处理办法:
可以在组件上使用自定义属性绑定数据,在组件中需要显式用props声明自定义属性名;
2.子组件-->父组件
处理办法:
需要用到自定义事件,父组件用$on监听自定义事件,$emit触发父组件所关心的自定义事件。
父组件-->子组件
例:
Vue.component('conSon'){
props:['btnValue'],//这里的名字不可以是烤串形式,必须是驼峰
template:'html结构'
}
props是专门绑定组件中自定义属性的;
子组件-->父组件
方法步骤:
1>创建一个变量val在父组件中,用于接收子组件的值;val='';
2>将val绑定到父组件要显示的input中
3>子组件的自定义标签中,添加自定义事件;
4>子组件中的元素(li)加点击事件,并通过vue自带监听事件,监听并回调要传的值;
methods:{
changeValue(item){
this.$emit('receive',item);
}
}
5>在父组件中的methods事件中写selectValue方法,方法中会传入value的值
methods:{
selectValue(value){
this.val=value;
//将最终得到的选项值赋给val显示到页面中
}
}
备注:$emit(str1,[str2])
str1:自定义事件名
str2:要传入的参数,可以是多个
触发当前实例上的事件,附加参数都会传给监听器回调;
这里的监听器可以理解为,子组件标签身上的自定义事件;
单向数据流
父组件向子组件传递数据,子组件不可以直接更改父组件的数据;
解决办法:
1>子组件可以通过自身组件中的data属性,来介接的改变父组件的数据;
2>也可以通过computed属性(计算属性)来改变父的数据;
props验证:
例:props:{
自定义属性名:{
type:Number,//设置类型 ---->>type:[String,Number]//类型也可以是多种
default:10,//设置默认值[可填]
required:true,//设置是否必填[可填]
}
}
自定义验证:
props:{
test(自定义属性名):{
validator:function(value){
retrun value>10;
//value,是test绑定对应的数据的值;
//return 验证规则,直接写retrun true验证直接通过;如果写规则逻辑就按逻辑走;
}
}
}
使用slot分发内容
使用一种方式混合组件内容与子组件自己的模版,这个过程称为"内容分发"。
什么时候使用slot: 要替换的标签
当写在自定义标签之间的内容,要混合子组件中的模版,这时就需要slot;
例:
一.单项替换
template:`
`
二.名字替换
slot也可以通过名字指定插入位置
如:
对应在父组件中写法:
当组件中需要替换同一个slot多的内容,可以使用标签。
例:
编译作用域:
父组件模版在父组件中编译;
子组件模版在子组件中编译;
封装组件:
组件的特点: 重用性、可定制性、高内聚性、互操作性!
组件运行顺序: 组件中的data说明: 如上所说写法: 实战项目说明 以上都输入后,会显示需要输入的一些命令: 按照上面提示的命令,在Vue-example目录下输入相应命令即可; 其中npm run dev 为启动项目,会在浏览器中自动打开项目页面,http://localhost:8080/#/ 显示一个这样链接的页面,即为项目创建成功; 项目文件目录说明: 单页应用 使用vue-router方法: 路由配置与创建的代码,都放到src下的router文件中,便于查找; vue-router:中的hash模式与history模式 history模式不支持IE8 history模式的好处: 注:如果在单组件元素中,设置的class名,是不会被router-view中的替换,会追加; 使用tag属性:tag="要生成的标签名",页面会生成指定的标签;并且不需要自己监听事件,vue-router都自动监听; 如: new Vue({ to属性中可以传一个对象的形式:可以同时写很多个配置项 router-link点击时,router会自动添加一个叫router-link-active的样式名,当我们需要点击后,添加一定样式的时候,可以去给这个样式名上,添加样式; 这个自带的样式名router-link-active的class名太长,可以自定义设置; ---哪里需要放哪里--- 路由路径重定向: redirect:(to) =>{//动态设置重定向目标 } }] 注:使用别名打开页面时,不会有选中效果,因为在router-link中匹配的是/home,而不是/index,这个问题在使用中需要注意。 按照以上方法写,页面打开,切换导航时,激活状态会出现混乱,home激活状态和其它按钮状态会重叠。 嵌套路由的使用: 在路由对象中,配置子路由,写法如下: 如何设置默认显示的子路由: 2> new VueRouter({ }); 需求:点击浏览器的前进和后退的按照时,让打开的页面,保持在之前页面滚动的位置; 做法: new VueRouter({ 动态路径 注:在路由path中,添加动态参数方法是 (:参数名),这里可以加多个; 获取参数:路由信息对象的params 如何拿到动态路由的信息? 通过在VUE根实例的router配置传入router实例 链接地址为:/user?info=share 过渡模式: 自定义运动效果: 自定义的css类名动画如何使用到transition组件中? 路由元信息: 路由meta的设置方法:(在路由对象中配置) 页面中获取方法: 通过监听$route,得到目标和离开导航的下标 导航钩子函数: 全局钩子函数例子如下: }) afterEach:导航切换后执行的函数 router.afterEach((to,from)=>{//切换导航后执行的函数 路由中写钩子函数:(routes中配置) 组件中写钩子函数: 在beforeRouteEnter中,当访问data数据中的数据时如何找到及处理办 console.log(this);//这里打印的是undefined beforeRouteUpdate 使用方法 afterRouteLeave 使用方法 Vue插件的编写: vuex代码,一般放在src/store/index.js文件中 如何在vuex中定义状态数据? State:包含所有应用级别状态的对象 Getters:在组件内部获取store中状态的函数 Mutations:唯一修改状态的事件回调函数 Actions:包含异步操作、提交mutation改变状态 Modules:将store分割成不同的模块 如何获取定义的状态数据? 如何改变vuex容器中(store)如的值? 一.改变非异步(不通过ajax)的值 注意: 这个方法,一个参数的时候,是直接调用mutations函数。 调用actions中的函数,方法如下 dispatch传参的格式方法,与this.$store.commit()一模一样 actions中的函数可以相互调用传值; //这里调用了下面的函数 actions:{ getters:{ 调用方法: HTML显示方法: {{num2}} 说明:结构中num与num2,显示的方式就分开了。 Vuex辅助函数 mapGetters: 转载于:https://www.cnblogs.com/nemoDuoo/p/7678141.html
使用组件,is的特殊属性:
当使用DOM作为模版时,会遇到由于W3C结构标准的限制,使用is属性可以将组件套用到任意标签中;
例:组件加到标签中
这样的写法,页面加载 后,会将组件自动拿出table;
-------------------------------------------------------------
使用is的方法:
这样加载后,custom标签会替换到tr标签的位置。
页面加载会先加载组件的自定义标签,然后再运行VUE中的template里的html结构,最后再自定义标签(组件)中。
组件中的data这个属性,用来放数据用的,data必须是一个函数,因为只有函数形式,每个组件的数据相互不会影响,如果是对象形式,组件之间都使用同一个对象数据,会相互影响;
data:function(){
return {这里写正式的数据}
}//在函数中,return一个对象,这样就不会相互影响了
VUE-Cli 脚手架
是VUE的一个工具;
作用:
1.生成目录结构;
2.完成本地开发调试;
3.在代码编写完后,对代码进行压缩和部署;
4.利用脚手架的热加载特性,搞代码效率;
5.使用单元测试,测试代码功能;
安装方法:
1.node 4版本以上,npm在3版本以上
2.先创建一个放vue-cli的文件夹(就是放VUE的项目文件)
3.安装指令:npm install -g vue-cli
4.检查是否安装成功:vue -V(V必须是大写)
5.下载模版:vue init webpack vue-example
说明:vue-example,是模版文件名,随便起的;前面的指令为指定命令;
6.下载过程中的设置说明:
a.? Project name vue-example :确认项目名是否为vue-example,直接回车;
b.?project descript(A Vue.js project):对vue项目的描述,可以自己随便改写描述,写完后,直接回车;
c.?Author(WYseven
d.?Vue build(Use arrow keys):显示一些信息,直接回车;
e.?Install vue-router?(Y/n):是否加载vue-roter,输入Y是加载,然后回车;
f.?Use ESLint to lint your code?(Y/n):是否检查代码风格,输入Y,回车;
g.?Pick an ESLint preset:显示检查代码的一些信息,直接回车;
h.?Setup unit tests with Karma+Mocha?(Y/n):是否要对代码进行测试,输入n,回车;
i.?Setup e2e tests with Nightwatch?(Y/n) :是否要e2e,输入n,回车;
cd Vue-example
npm install
npm run dev
一级文件目录说明:
1.buil:webpack相关文件;
2.config:生产环境和开发环境的配置参数;
3.node_modules:第三方依赖;
4.src:项目源码文件,vue后缀的文件为,单文件组件
,这个文件里的代码,会被webpack进行处理;
5.static:放置第三方资源,其中有.gitkeep,需要上传空白文件夹时,需要在文件后缀写.gitkeep
6..babelrc:配置浏览器不支持的ES6新语法的转换;
1)presets:预设,语法放转换的插件;
如:env是ES6转换成ES5的插件;
stage-2 草案阶段;
2)plugins:配置方法转换插件;
如:transform-runtime:ES6方法转换成ES5方法;
3)comment:转换后代码上是否增加注释,flase为不增加;
4)env:test使用测试的时候使用的;
7..editorconfig:配置编辑器的格式风格等;
如:文件编码;
8..eslintignore:代码检查时,设置需要忽略的文件;
默认忽略:build/*.js config/*.js
9.eslintrc.js:代码风格检查;
10..gitgnore:使用git提交项目时,忽略指定文件和文件夹;
11..postcssrc.js:设置css的一些规则;
12.index.html:项目运行的模版
13.package.json:项目的一些配置;
14.README.md:对项目的使用说明;
vue-router
什么是前端路由:
在web开发中,路由是指根据url分配到对应的处理程序。
作用:
通过管理url,实现url和组件的对应和通过url进行组件之间的切换。
加载单个HTML页面,并在用户与应用程序交互时动态更新该页面;
安装模块:
npm install vue-router --save
引入模块:
import VueRouter form 'vue-router'
作为Vue的插件
Vue.use(VueRouter)
创建路由实例对象
new VueRouter({--配置参数})
注入Vue选项参数
new Vue({router})
告诉路由渲染的位置
语法:mode:'history',
注:一般都是使用history模式,history模式适用于高版本;
使用history模式,跳转后的页面链接,会自动保存到浏览器中,可以使用浏览器自带的前进后退功能,回到之前打开过的页面;
router-link:各种配置项
页面渲染结果:
默认router-link会渲染成a标签;
home
router-link中的to属性:相当于a标签中的href,此属性也可以动态绑定;
如:
data(){
index:'/home'
}
});
如:
设置方法:
方法一:在路由中设置
new VueRouter({
linkActiveClass:'要设置的class名' //重置router-link点击后的class名称
})
方法二:直接在router-link标签上设置
重定向和别名:
router-link默认是点击事件,如何修改默认事件行为:
在标签中使用event属性,写入事件名,即可修改;如下:
这样就改成了,鼠标移入事件;
当遇到没有匹配到的路径时,如何处理:
new VueRouter({
routes:[
path:'*',//匹配除去指定路径的,其它的路径
component: 要跳转的页面,如何给一个404提示页等。
name:'404'//这里的name属性是打这个路由的名字,可以给对应的路由起一个名字,方法以后的查找;
]
});
new VueRouter({
routes:[
{
path:'*',
redirect:'/home'//这里重定向的路径
redirect:{path:'/home'}//也可以写成对象的形式
redirect:{name:'home'}//这里的name代表的是路由的名字,直接指定这个名字的路由即可
//to 目标路由对象,就是访问的路径的路由信息
return '/home' //这里返回要打开的目标
}]
});
路由的别名使用方法:
new VueRouter({
routes:[
{
path:'/home',
component:home,
alias:'index' //使用这个属性设置别名
})
根路径设置问题:
默认打开http://locallhost:8080 时,打开是空白页,没有渲染相关页面时,这就需要设置一个根路径;方法如下:
new VueRouter({
routes:[
{
path:'/'//直接写/就代表根路径
component:home
}]
});
router-link 标签中的to路径也要改成'/';
原因:默认根路径是一个全包含模式;
处理方法:
哪里是根路径,就加在哪里
new VueRouter({
routes:[
{
path:'/about',
component:about,
children:[//这个属性用于配置子路由
{
path:'study',
component:study
}]
}
]
});
关注点分离概念:
对应的路径,渲染对应的组件;
在子路由对应的,路由中,将path:中的值,设置为空'',即可
注意,如果路由中,有了子路由,就不要把name给父路由设置,直接设置子路由即可,否则浏览器会警告提示。
命名视图:
概念:就是对router-view标签起一个名字;
使用场景:当遇到同一个单页面组件里,需要出现两个或多个router-view时,就需要对标签命名了;
命名方法:
1> 通过name属性起名
routes:[
{
path:'/document',
components:{//组件属性写成对象形式
default:document, //default为默认组件
slider:slides
//slider:写的是标签中的name值;
//slides:写的是slides这个名字的.vue文件,需要引入到页面中
}
}]
注意:是在对应的路由中添加;
滚动行为:
浏览器滚动默认行为说明:当页面滚动到一定位置后,手动刷新浏览器,会发现页面依然在之前滚动位置,这是浏览器记录滚动位置的默认行为;
scrollBehavior(to,from,savedPosition){//滚动行为,在点击浏览器的前进后退或切换导航时,触发
//to:要进入的目标路由对象 (要去哪里)
//from:离开的路由对象 (从哪里来)
//savadPosition:记录当前滚动位置滚动条的坐标,点击前进后退时,坐标值 {x:0,y:0}
}
});
匹配到的所有路由,全都映射到同一个组件
// 动态路径参数 以冒号开头
{ path: '/user/:id', component: User }
路径:/user/:userId userId为动态路径参数
userId可以使用正则符表示
如:
匹配 /user/:userId 有userId和没有userId的都需要匹配上,可以写成:
path:/user/:userId? //这里的userId?表示有userId和无userId都能匹配
如:user/:userId/:tip
created(){
//渲染这个组件会调用一次这个生命周期函数
//复用这个组件,这个函数不会再次被调用了
//地址一但发生变化 ,$route会重新生成一个路由信息对象
console.lo
g(this.$route)
}
对组件的注入
$router router实例对象
$router 当前激活的路由信息对象,每个组件实例都会有;
beforeRouterEnter() 进入组件前钩子函数
beforeRouterLeave() 离开组件前钩子函数
如何监控路由发生的变化?
watch:{//在watch中监控路由
$route(){
//路由有变化,都会在这里监控到
//路径发生变化,$route会重新赋值,监控了这个属性,会执行这个函数
}
}
query查询字符串说明:
带查询参数的链接地址,称为:查询字符串
如:
//下面的结果为 /user?info=share
在切换router-link时,如何获取查询字符串中,info=share的share字符串?
通过路由信息对象中的query对象,用于URL查询参数的对象;
过渡动效:
router 提供了transition的封装组件,添加过渡动画
控制方法:会用CSS类名控制
使用方法:
将需要添加过渡效果的router-view包在transition标签中;如下 :
in-out:新进行过渡,完成之后当前元素过渡离开
out-in:当前元素先进行过渡,完成之后新元素过渡进入
使用方法如下:
自带的css类名,是以v-开头的,后面的不能改变,v-可以随意修改;
如下:
v-enter:进入过渡时要做的动画;
可以改成
left-enter:自定义的动画
在路由配置中meta可以配置一些数据,用在路由信息对象中,访问meta中的数据:$route.meta
routes:[
{
path:'/',
meta:{
index:0;//路由的下标
}
}
]
如果路由中有子路由,就配置到默认的子路由中,不用配置到父路由中;
$route.meta.index
watch:{
$route(to,from){
to.meta.index //目标导航下标
from.meta.index //离开导航下标
}
}
beforeEach(to,form,next):导航切换之前执行的函数
router.beforeEach((to,from,next)=>{ //只有切换导航就会执行 切换导航前执行的函数
console.log('beforeEach')
next();//是否继续下一个目标路由,flase是不执行,true是执行
next(false);
next('要执行的路径') //可以传一个路由的路径,要执行到哪个路径;
//使用场景,比如当进行指定路由时,需要先登陆才可以查看;
if(to.meta.login){//在指定路由中,先在meta:{login:true} 在meta中做一个标识。判断当login为true的时候,就进入到登陆路由页面
//使用next('/login');
}else{
next();//否则直接进入下一个路由
}
//通过判断显示对应路由的title信息
if(to.meta.title){
window.document.title = to.meta.title;
}else{
window.document.title ='我要学'
}
})
beforeEnter:切换前执行
使用方法与全局一样
beforeRouteEnter(to,from,next):切换前执行
afterRouteLeave:切换后执行
beforeRouteUpdate:当导航中有二级导航时,切换二级导航会触发这个钩子
前两个使用方法与全局一样
beforeRouteEnter(to,from,next){
//注意这里面的this问题
}
法:
export default {
data(){
return {
test:'测试数据'
}
},
beforeCreat(){//组件创建的钩子
//页面加载这个钩子后执行
},
beforeRouteEnter(to,from,next){//组件路由钩子
//因为,加载页面时,先执行了beforeEnter的函数,后创建vue实例,所以this得到的是undefined
//解决办法
next((vm)=>{//next回调中,会传vue的实例过来
console.log(vm.test);//通过这样就可以访问到vue实例中的数据
});
}
}
beforeRouteUpdate(to,from,next):使用方法与全局导航一样
afterRouteLeave(to,from,next):使用方法与全局导航一样
第一个种:
通过在vue的原型链上添加自定义属性($custom)
Vue.prototype.$custom = "这是自定义的属性"
-----------------------------------------------------------------------------------------
VueX
使用VueX
1.安装vuex模块
npm install vuex --save
2.作为插件使用
Vue.use(Vuex)
3.定义容器
new Vuex.Store({
这里面放定义状态代码
})
4.注入根实例
{store}
例:
//创建Vuex实例
let store = new Vuex.Store({
//这里定义状态数据
state: {
count: 100
}
});
vuex核心概念
store:类似容器,包含应用的大部分状态
* 一个页面只能有一个store
* 状态存储是响应式的
* 不能直接改变store中的状态,唯一途径显示地提交mutations
例:
在需要获取数据的单页面文件组件中,使用以下方法
html结构:
简易加法计算器
{{num}}
export default {
computed:{//在计算属性中取vuex定义的状态数据
num(){
//因为vue中已经注入了vuex的实例,并做为了插件,所以this.$store可以直接得到vuex的实例
//this.$store.state 获取的是 vuex实例state中定义的状态数据
return this.$store.state.count;
}
}
}
使用mutations属性,处理同步数据修改
例:
vuex对象中写:
mutations:{//专门用于处理state中状态数据的回调
//这里的回调函数自己根修改状态数据的逻辑,随意写
addIncrement(state){//自己写的函数都会传一个state,用于找到状态中对应的数据
state.count +=1;
},
delIncrement(state){
//关于状态数据修改逻辑类的代码,都在这里处理
if(state.count<=0){
state.count = 0;
}else{
state.count -=1;
}
}
}
在单页面文件组件中调用
methods:{
delHadler(){
//delHadler函数触发时,调用mutations中的回调函数。
//调用方法,需要使用$store下的commit方法,参数中传入mutations中的回调函数名
this.$store.commit("delIncrement");
},
addHadler(){
this.$store.commit("addIncrement");
}
}
mutations不能直接调用;
调用方法:
$store.commit("写mutations中的回调函数名");
第二个参数,代表传入mutations函数的参数。
第二个参数,可以是1个,多个的时候,传一个对象;
如:
$store.commit("写mutations中的回调函数名",{n:2});
这样在mutations:中就可以接收了
commit的对象形式写法
$store.commit({
type:'写mutations中的回调函数名',
de:10 //这个就是第二个参数,key名随便起
})
二.改变异步(ajax获取)的值
使用actions:处理异步数据修改
//要先写好mutations的方法
mutations:{
addIncrement(state){
state.count +=1;
}
},
/*
当遇到数据是通过ajax异步请求过来的,这时数据会有延迟
这种时候,就需要使用actions来提交mutations中的回调函数
*/
actions:{
//函数名随便写,参数是一个对象,和store对象的方法属性都一样的对象;
addAction(context){
setTimeout(()=>{
//通过context对象,可以使用commit方法,参数输入mutations中的函数名
context.commit('addIncrement');
},1000);
}
}
this.$store.dispatch('addAction');
例:
actions:{
//函数名随便写,参数是一个对象,和store对象的方法属性都一样的对象;
addAction(context){
setTimeout(()=>{
//通过context对象,可以使用commit方法,参数输入mutations中的函数名
context.commit('addIncrement');
context.dispatch('testAction',{test:'测试'});
},1000);
},
testAction(context,obj){//传值正常传
//可以打印出'测试的数据'
console.log(obj.test);
}
}
actions传值的另一种方法
//函数名随便写,参数是一个对象,和store对象的方法属性都一样的对象;
/*
这个context参数,可以使用es6的结构赋值方法写
直接传一个对象形式{commit,dispatch} 把需要的方法直接写到里面,不用传context去调用对应的方法
这样写更方便。
es6的结构赋值:把一个对象里面的属性,直接放到对象中;
*/
addAction({commit,dispatch}){
setTimeout(()=>{
//通过context对象,可以使用commit方法,参数输入mutations中的函数名
commit('addIncrement');
dispatch('testAction',{test:'测试'});
},1000);
},
testAction(context,obj){
console.log(obj.test);
}
}
getter计算状态
作用:关于状态数据中,一些对数据的处理(判断/过滤)等,都在getter属性中处理。
写法:在vuex对象中写
filterCount(state){//state就是状态对象
//在这里做count的判断
return state.count >= 120 ? 120 : state.count;
}
}
computed:{//在计算属性中取vuex定义的状态数据
//getter的调用方法,就是在计算属性中,另定义一个函数,在这个函数中调用getter中判断过的值
num2(){
//$store中有getters属性,可以获取getter中的filterCount的值
return this.$store.getters.filterCount;
}
}
简易加法计算器
{{num}}
mapState:
当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性。
辅助函数仅仅是将 store 中的 getter 映射到局部计算属性
mapMutations:
将 store 中的 mutations 映射到局部计算属性
mapActions:
将 store 中的 actions 映射到局部计算属性你可能感兴趣的:(vue学习笔记)