第二周vue学习

Posted wst-0115

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二周vue学习相关的知识,希望对你有一定的参考价值。

单文件组件:

框架:

 

 如果我们的组件为一个,通常采用默认暴露:export default school(名字)

  

 上图中,name:“school”;组件名通常与xxx.vue名相同(name省略也可以运行,组件名则会被随便取)

app.vue:汇总全部组件

main.js:创建vue实例,并且指明为哪个容器服务

index.html:准备一个容器

 

 render函数(在创建实例对象中):

关于不同版本的Vue:
1.vue.js与vue.runtime.xxx.js的区别:
(1)vue.js是完整版的Vue,包含:核心功能+模板解析器。
(2)vue.runtime.xxx.js是运行版的Vue,只包含:核心功能;没有模板解析器。
2.因为vue.runtime.xxx.js没有极板解析器,所以不能使用template配置项,需要使用render函数接收到的createElement函数去指定具体内容。
render函数完整写法;

render(createElement)

        return createElement(\'h1\',\'你好\')

简写:   render:h=>h(\'App\'),

脚手架文件结构;

 

 ref属性
1.被用来给元素或子组件注册引用信息(id的替代者)
2.应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc)
3.使用方式:
  打标识:<h1 ref="xxx">.....</h1> 或 <School ref="xxx"></Schoo1>

  获取:this.$refs.xxx   (拿到组件实例对象,而id是拿到id绑定的body结构)(这里this指vc)

props配置(父传子):

1.功能:让组件接收外部传过来的数据

父  :

 

 子  :

 

 并且可以在子的template中使用该数据。

2.简单声明接收:

props:[\'name\',\'age\',\'sex\']

3.接受的同时对数据进行限制:

props:

   name:

       type:String,    //name类型是字符串

       required:ture     //name是必要的

   

   age:

        type:Number,

        default:99   //设置默认值

   

4.props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。

mixin(混入):

1.功能:可以把多个组件共用的配置提取成一个混入对象

2.使用方式:
第一步定义混合:例如:

data()....,
methods:·..·

第二步使用混入,例如:
(1)全局混入:Vue.mixin(xxx)
(2)局部混入:mixins:["xxx"]

 

 scoped样式:

1.作用:让样式在局部生效,防止冲突。

2.写法:<style scoped>

Todo-list案例:

组件化编码流程(通用):

1.实现静态组件:抽取组件,使用组件实现静态页面效果

2.展示动态数据:

       2.1.数据的类型、名称是什么?
      2.2.数据保存在哪个组件?

一堆数据用数组,每个数据用对象

[ id=\'xx",

name=\'xx\',

id=\'xxx\',

name=\'xxx\'

       

]

 

 根据数据数量遍历:

 

 ps:随机生成id:nanoid

可以使用npm i nanoid 引入

import nanoid from \'nanoid\'

使用时 id=nanoid()

3.交互-从绑定事件监听开始

父子之间传递数据:

父--->子:props

子---->父:父亲中定义一个函数,儿子调用父亲中函数

v-model="todo.done"也能实现勾选的同时传递数据,但不太推荐,因为有点违反规则,修改了props,只是是浅层次的,vue不会发现。

 

删除一个todo(过滤器):

在app中,deleteTodo(id)

this.todos=this.todos.filter((todo)=>return todo.id!==id)

补充:

reduce( (pre,current)=>   ,0)  //加粗部分,数组长度几,就调用几次

第二次调用函数,pre是第一次调用的返回值

最后一次调用函数的返回值是reduce的返回值

总结:

1.组件化编码流程:
(1)拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突。
(2)实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:
            1)一个组件在用:放在组件自身即可。
            2)一些组件在用:放在他们共同的父组件上(状态提升)。
(3)实现交互:从绑定事件开始。
2.props适用于:
(1)父组件==>子组件 通信
(2)子组件==>父组件通信(要求父先给子一个函数)
3.使用v-model时要切记:v-model绑定的值不能是props传过来的值,因为props是不可以修改的!
4.props传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但不推荐这样做。

webStorage:
1.存储内容大小一般支持5MB左右(不同浏览器可能还不一样)
2.浏览器端通过Window.sessionStorage和 Window.localStorage 属性来实现本地存储机制。
3.相关API:
1. xxxxxStorage.setItem(\'key\', \'value\');
该方法接受一个键和值作为参数,会把键值对添加到存储中,如果键名存在,则更新其对应的值。

eg:存放对象:

let p= name:\'xx\',age:18

localStorage.setItem( \'person\',JSON.stringify(p) )
2.xxxxxStorage.getItem(\'person\');      
该方法接受一个键名作为参数,返回键名对应的值。

eg:读取对象:

const result=localStorage.getItem( \'person\' )

JSON.parse(result)
3.xxxxxStorage.removeItem(\'key\');   //移除
该方法接受一个键名作为参数,并把该键名从存储中删除。
4.xxxxxStorage.clear()   //清空

该方法会清空存储中的所有数据。
4.备注:
1.SessionStorage存储的内容会随着浏览器窗口关闭而消失。
2.LocalStorage存储的内容,需要手动清除才会消失。
3.|xxxxxStorage.getItem(xxx)如果xxx对应的value获取不到,那么getltem的返回值是null。
4.JSON.parse(nul1)的结果依然是null。

组件的自定义事件(在父组件中给子组件绑定自定义事件,事件回调在父中):

1.绑定事件:

在app中给实例对象studengt绑定atguigu事件(getStudentName无()

 

在methods中定义事件

 

 

 在实例对象student中

 

 

 

 给谁绑,谁触发!!

2.子----->父两种方式:

(1)父组件给子组件传递函数类型的props实现

(2)父组件给子组件绑定一个自定义事件实现:

        1)使用@或v-on

 

        2)使用ref

 

绑定自定义事件(app中)

 

 

 一次性的事件将 $on 改成 $once

ref可以实现定时器功能:

 

 3.解绑

解绑一个:this.$off(\'atguigu\')

解绑多个:this.$off( [\'atguigu\',\'demo\'] )

this.$destroy()  //销毁了当前student组件的实例,销毁后所有student实例的自定义事件全部不奏效。

注:

(1)组件上也可以绑定原生DOM事件,需要使用native修饰符

eg:@click.native="show"
(2)通过this.$refs.xxx.$on('atguigu”,回调)绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题。

全局事件总线(任意组件中通信):

1.在main.js中,安装全局事件总线

 

 this指vm,bus总线,$bus就是当前应用的vm

2.使用全局事件总线

(1)接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。
methods()
demo(data)......


mounted()
this.$bus.$on(\'xxxx\',this.demo)

(2)提供数据:this.$bus.$emit('xxxx',数据)
3.最好在beforeDestroy钩子中,用this.$bus.$off(事件)去解绑当前组件所用到的事件。

 

父---------------------------------props-------------------------------------->子

    <---------props(函数)、自定义事件、全局事件总线-----------

消息订阅与发布(第三方库pubsub.js)

安装:npm i pubsub-js

引入(哪用哪引入)import pubsub from \'pubsub-js\'

pubsub.subscribe( 消息名,function(消息名,真正参数))

 

接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身。

methods()

demo(data)     

mounted()

this.pid=pubsub.subscribe('xxx',this.demo)//订阅消息


提供数据:pubsub.publish(*xxx',数据)
最好在beforeDestroy钩子中,用PubSub.unsubscribe(pid) 去取消订阅

nextTick
1.语法:this.$nextTick(回调函数)
2.作用:在下一次DOM更新结束后执行其指定的回调。
3.什么时候用:当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数中执行。

动画效果

@keyframes  名   

元素进入的样式:
1.v-enter:进入的起点
2.v-enter-active:进入过程中
3.v-enter-to:进入的终点
元素离开的样式:
1.v-leave:离开的起点
2.v-leave-active:离开过程中
3.v-leave-to:离开的终点
使用<transition>包裹要过度的元素,并配置name属性:(加了name,则以上的v要换成name中的名字)
<transition name="hello">
       <h1 v-show="isShow">你好啊!</h1>
</transition>
备注:若有多个元素需要过度,则需要使用:<transition-group>,且每个元素都要指定key值。

解决跨域问题的3种方法:

1.cors

2.json

3.代理服务器:

(1)在vue.config.js中添加如下配置:

devServer: proxy:\'服务器网址\' //开启代理服务器

1.优点:配置简单,请求资源时直接发给前端(8080)即可。

2.缺点:不能配置多个代理,不能灵活的控制请求是否走代理。
3.工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器(优先匹配前端资源)

(2)编写 vue . config . js 配置具体代理规则:

1.优点:可以配置多个代理,且可以灵活的控制请求是否走代理。
2.缺点:配置略微繁琐,请求资源时必须加前缀。

前缀:紧跟8080(或其他数字)eg:.....8080/atguigu/students........

devServer:

proxy:

\'/atguigu\',

pathRewrite:\'^/atguigu\' : \' \'    //可以保证5000服务器请求的资源不是来自atguigu/student,而是/student

第三方库引进可以放在src下的assets下的文件夹中

返回数据:

 

 可以把axios.get(.......)改成this.$http.get(...)

slot插槽

1.作用:让父组件可以向子组件指定位置插入 html 结构,也是一种组件间通信的方式,适用于父组件===>子组件

2.分类:默认插槽、具名插槽、作用域插槽
3.使用方式:
    1)默认插槽:

2)具名插槽:

 

 <... slot="xx">可以追加,不会覆盖

将一大段内容放在<template>中时,可以将<template slot="xx"换成v-slot:xx

3)作用域插槽:

1.理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。( games 数据在 Category 组件中,但使用数据所遍历出来的结构由 App 组件决定)
2.具体编码:

 

              

 

 

 

 

案例:

 

 使用:listData(命名)=”数据名“,接收时只要props:[\'listData\']即可,不需要太多遍。

 

 红框部分会被塞到<slot>中去,<slot>默认值,未设置塞入内容时出现,有内容插入则不出现</slot>

 

学习进度第二周

  第二周
所花时间 10小时
代码行数 150行
博客量 3篇
学到的知识点 循环的使用,随机数生成,if语句

虽然四则运算二花了很长的时间,用了很大的精力,但是还是有很多功能没有实现,

以上是关于第二周vue学习的主要内容,如果未能解决你的问题,请参考以下文章

第二周周报

第二周学习进度

第二周学习进度

第二周的学习进度

第二周学习总结

第二周学习进度