2020-08-28-Vue学习(一)
前言
前端学习之路,目标Vue+react
一、HTML+CSS+JS入门
这些入门知识在各部分可以找到,本人学习是在http://www.lvyestudy.com/(绿叶学习网)总结较为到位,但是因为时间过于久远,有些东西需要补充和更新,可以在 菜鸟教程 和 W3School 对应学习
二、HTML+CSS+JS进阶学习
1.学习网站
绿叶学习网:http://www.lvyestudy.com/
菜鸟教程:www.runoob.com
W3school:https://www.w3school.com.cn/ (中文版的)
B站:https://www.bilibili.com/video/BV1i7411Z7d8?p=92 (html5+css3)
https://www.bilibili.com/video/BV15741177Eh?p=58 (Vue学习)
https://www.bilibili.com/video/BV1xW411x7sw?p=9 (es6)
其他: https://es6.ruanyifeng.com/#docs/spec (阮一峰的es6入门)
三、Vue学习之路
一、基础知识
(一)、认识
- 渐进式框架
- 高级功能
- 解耦视图和数据
- 可复用的组件
- 前端路由技术
- 状态管理
- 虚拟DOM
(二)、生命周期(来自之前B站vue的视频,若侵权即删除)
(三)、基础语法
1、Options
- el 挂载点,绑定DOM元素
- data 数据对象
- methods 方法
- computed 计算属性,类似于methods,但会进行缓存,效 率更高
- filters 过滤
- components: 组件
2、Mustache语法,即通过‘{{}}’使用数据
3、指令
v-once:元素和组件只渲染一次
v-html:解析html代码并渲染
v-text: 文本
v-pre:跳过这个元素和它子元素的编译过程
v-cloak:斗篷,掩藏未编译的mustache标签
v-bind:动态绑定属性,语法糖“:”
v-on:事件监听,语法糖“@”,可以通过$event传入事件
修饰符:
.stop - 调用 event.stopPropagation(),阻止冒泡。
.prevent - 调用 event.preventDefault(),阻止默认行为。
.{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回 调。
.native - 监听组件根元素的原生事件。
.once - 只触发一次回调。
v-if、v-else、v-else-if:根据表达式的值在DOM中渲染或销毁元素或 组件。
v-show:决定元素是否渲染,但是通过设置display属性实现
v-for:遍历数组,格式类似(item, index) in items
使用时加上:key属性,作用主要是为了高效的更新虚拟DOM
v-model:实现表单元素和数据的双向绑定,本质上是
a.v-bind绑定一个value属性
b.v-on指令给当前元素绑定input事件
这两个操作的集合
修饰符
.lazy: v-model默认是在input事件中同步输入框的数据的。lazy修饰符 让数据在失去焦点或者回车时才会更新
.number修饰符: 让在输入框中输入的内容自动转成数字类型:
trim修饰符: 过滤内容左右两边的空格
二、组件化
(一)、组件的使用:
创建组件构造器,通过Vue.extends()方法
注册组件,通过Vue.component()方法
使用组件。Vue实例范围内使用组件
(二)、全局组件和局部组件
如果注册的组件是挂载在某个实例中, 那么就是一个局部组件
(三)、父组件和子组件
在某个组件构造器中注册使用另一个组件,则两者为父子关系,并且若想在vue实例范围中使用,就要在vue中注册,vue本身可以看作一个root组件
- 语法糖:省去调用Vue.extend()的步骤,而是直接使用一个对象来代替。在component方法中实现
- 模板分离写法,使用<script type=“text/x-template”>标签,or 使用<template>标签,不过要通过id绑定到对应组件上
(四)、关于组件部分
Data在组件中必须是一个函数,如果是对象的话,改动会导致相互影响致使连锁反应,且vue实例无法直接访问组件中的数据,组件中也有methods、compute等写法
(五)父子组件间的通信
- 通过props向子组件传递数据:
在组件的option中使用props使用数组或对象来传递数据,在使用对象时可以指定类型、默认值乃至是否必须传送,在父组件中通过v-bind绑定
- 通过事件向父组件发送消息:
主要流程是:
在子组件中,通过$emit(‘事件名’, 参数)来触发事件。
在父组件中,通过v-on来监听子组件事件。
(六)、父子组件间的访问
- 父组件访问子组件:使用$children或$refs:
this.$children是一个数组类型,它包含所有子组件对象。
$refs和ref指令通常是一起使用的。
先通过ref给某一个子组件绑定一个特定的ID。
再通过this.$refs.ID就访问到该组件了
- 子组件访问父组件:使用$parent:
子组件应该尽量避免直接访问父组件的数据,因为这样耦合度 太高
(七)、编译作用域
(八)、Slot插槽
为了让封装的组件更具扩展性,作为组件中的预留内容,完成不同实现
- 具名插槽:渲染指定的插槽
在向具名插槽提供内容的时候,需要在一个 <template> 元素上使用 v-slot 指令,并以 v-slot 的参数的形式提供其名称
- 作用域插槽:父组件替换插槽的标签,但是内容由子组件来 提供。
绑定在 <slot> 元素上的 attribute 被称为插槽 prop。在父级作用域中,使用带值的 v-slot 来定义我们提供的插槽 prop 的名字
- v-slot指令是新版内容,且只能在templat标签内使用,有参数时刻缩写为” # ”
三、其他
(一)模块化规范
- CommonJS
导出:module.export = {}
导入:let (...) = require(‘filename’)
- ES6模块
导出:
export {...}
export function funcname(argument...){}
export class classname{...}
export default ...(可以由导入者自行命名,且文件中只有一个)
导入:
Import {} from ‘filename’
Import * as ‘alias’ from ‘filename’
插槽代码如下(示例):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<cpn>
<!-- 1、具名插槽的使用 -->
<!-- <template v-slot:search>此处原为搜索</template> -->
<!-- 2,作用域插槽的使用 -->
<template v-slot:case="slotProps">
<span>{{slotProps.lang.join('/')}}</span>
</template>
</cpn>
<cpn></cpn>
</div>
<template id="cpn">
<div>
<span>组件模板</span>
<br>
<!-- 1、具名插槽使用 -->
<!-- <slot name="search"><button>搜索</button></slot>
<br>
<slot name="password"><input type="password"></slot>
<br>
<slot name="input"><span>输入</span></slot> -->
<!-- 2、作用域插槽的使用 -->
<slot :lang='pLanguages' name='case'>
<ul>
<li v-for="item in pLanguages">{{item}}</li>
</ul>
</slot>
</div>
</template>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
message:"hello"
},
components: {
cpn: {
template: '#cpn',
data(){
return {
pLanguages:['Java', 'C++', 'Go', 'Python', 'PHP', 'C#', 'Vue']
}
}
},
}
})
</script>
</body>
</html>
总结
第一次写博客,vue的学习总结