Vue 常用API整理 1
来源:互联网 发布:java工程师所属部门 编辑:程序博客网 时间:2024/06/06 16:05
Vue 常用 API 整理 1 - 组件属性与方法
1. 单文件组件说明
.vue
文件是一个自定义的文件类型,用类HTML语法描述一个Vue组件。每个.vue
文件包含三种类型的顶级语言块
<template> <!-- HTML 代码, 每个 .vue 文件对多包含一个<template> 内容将会被提取为字符串,将编译并用作Vue组件的template选项 --> </template> <script> /* javascript 代码, 每个 .vue 文件对多包含一个<script>, 可以通过 require、import、export 引入或者导出其他模块 导出的对象为 vue组件对象 */ </script> <style> /* 样式代码 一个 .vue文件可以包含多个 <style>, 通过设置 style 标签的 lang属性 可以配置预处理器 sass less, 当 style 标签有 scoped 属性时,他的 css 只作用于组件中的元素 */ </style>
项目中通过安装
vue-loader
来解析这种文件,它会提取每个语言快,经过相应的 loader 处理,最后组成一个 CommonJs 模块,输出一个 Vue组件对象如果习惯于将 结构、表现、行为分离,可以分割
.vue
文件为多个文件,通过src
引用
<template src="./template.html"></template> <script src="./script.js"></script> <style src="./style.css"></style>
2. 创建Vue实例
每个 Vue 应用都是他通过 Vue 函数创建一个新的 Vue 实例开始的,创建实例时,可以传入一个选项对象,这些选项对象用来配置你想要的行为
var vm = new Vue({ data: {}, })
在大型项目中,一个应用只需要一个 他通过
new Vue()
创建的根实例,其他部分通过嵌套组件来完成
3. 实例属性、组件的属性
Vue 实例暴露了一些有用的实例属性与方法,他们在创建实例时,写在配置对象中,创建实例后可以通过
添加前缀$
后的属性名调用,以便与用户定义的属性区分
vm.$data => data vm.$props => props vm.$el => el ...
1. data
实例或者、组件的数据对象,数据类型为对象或者函数(必须返回值为对象),组件的 data 只能是含有对象返回值的函数
Vue 实例代理了 data 对象上的所有属性
// 创建 Vue 实例 const vm = new Vue({ data: { count: 1 } }); // vm.$data 可以访问 data 实例上的属性 console.log(vm); console.log(vm.count === vm.$data.count); // true // 组件 const Component = Vue.extend({ data () { return { num: 20 }; } });
data 中数据(创建时存在的属性)是响应式的,数据改变时,视图会重绘
const vm = new Vue({ data: { count: 1 } }); // 以下两种改变的 data 都是响应式的 vm.$data.count = 2; vm.count = 3; // 如果是创建时不存在 data 中的属性,则不会有响应式 vm.num = 4;
对比 : 类似于 react 组件中定义的
this.state
保存组件的状态,组件状态改变后触发组件更新
2. computed
计算属性,Vue 的模板中允许使用 javascript 的表达式进行简单计算,但是对于需要复杂的计算的属性,需要使用
computed
将逻辑提取出来,便于管理维护计算属性的绑定与 data 中的普通属性一致,他返回一个值,如果这个值的计算依赖于 其他具有 响应式 的属性(props|data),那么 Vue 会在它所依赖的属性改变时,更新这个计算属性
export default { data () { return { text: 'home-basic-container' }; }, computed: { computedText() { return this.text.split('-').reverse().pop(); } }, }
以上声明的 computed 计算属性(数据类型为函数)实际将会作为对象 getter 函数(默认),我们也可以显式的设定他的 setter 函数
data () { return { text: 'home-basic-container' }; }, computed: { computedText: { get () { return this.text.split('-').reverse().pop(); }, set (newVal) { this.text = newVal.toUpperCase(); } } }, methods: { handleClick() { // 如果没有设置 setter 会报错 [Vue warn]: Computed property "computedText" was assigned to but it has no setter. this.computedText = 'onClick'; // 更改 computedText 后 this.text 也相应的改变 console.log(this.text, this.computedText); // ONCLICK ONCLICK } }
对比:react 中使用 jsx 语法,复杂的计算可以提取出函数来处理,更加灵活,而在 vue 中,使用了 computed 计算属性,将赋值和计算分离
3. props
props 可以是数组或者对象,用于接收来自父组件的数据,如果是对象类型,可以用来配置类型检验,设置默认值等高级功能 。
真实传入 props 是在父组件中调用子组件时,但是在子组件中需要显式的用 props 选项声明它预期的数据,更多验证规则
非 Prop 特性,指的是 直接传入组件,组件中不声明相应的 prop,这种方式定义的props,在子组件中不方便使用,但是会直接添加到 子组件的根元素上
<template> <div class="home-container" @click="handleClick" > <HomeBasic propText="this is props" test-props="111"></HomeBasic> </div> </template>
export default { name: 'HomeBasic', data () { return {}; }, props: { // 没有 声明 test-props 属性 propText: { type: String, default: '', required: true } }, methods: { handleClick() { // 通过 this.$attrs 可以获取 父组件进来的绑定 console.log(this.$attrs); // {propText: "this is props", test-props: "111"} } } };
对比:与 react 中 props 类似,都是在父组件中写作子组件的属性,但是 vue 中需要显式的列出,需要的 props
4. methods
methods 与其他属性一样将被混入到 Vue 实例中,可以通过 vm 实例访问这些方法,或者在指令表达式中使用,方法中的 this 自动绑定为 Vue 实例(非 => 函数)
<div class="home-basic-container" @click="handleClick"> this is {{text}} </div>
methods: { handleClick(e) { // 通过 this 调用 console.log(e); this.change(); }, change() { this.text = 'onClick'; console.log(this.text); } }
对比:相比于 react 将所有函数写在配置在最外层,vue 将组件的生命周期函数与普通函数分开,使得逻辑更清晰
5. watch
观察 Vue 实例变化的一个表达式或者计算属性,值为一个接受旧值和新值的函数,或者方法名,Vue 实例会在 实例化时期调用
可以用于,监听某个状态变化,变化后做出相应的响应或者操作
export default { name: 'HomeBasic', data () { return { text: 'home-basic-container' }; }, methods: { handleClick() { this.text = 'onClick'; console.log(this.text); } watchTextChange(newVal, oldVal) { console.log(newVal, oldVal); } }, watch: { // 一下是三种 书写格式 text(newVal, oldVal) { console.log(newVal, oldVal); }, text: 'watchTextChange', text: { // 可以用对象来进行配置 handler(newVal, oldVal) { console.log(newVal, oldVal); }, deep: true } } };
对比:react 中没有专门对应的Api 但是在组件的 componentWillReceiveProps 等生命周期中还是可以进行类似操作的。
6. el
只有在 new 创建的实例中才会使用,提供一个在页面上已存在的 DOM 元素,作为Vue的挂载目标,可以是 css 选择器,也可以是 html 实例
const vm = new Vue({ el: '#app' }); vm.$el; // <div id="app"></div>
对比:react 中注册应用,也会用到这样一个挂载目标
7. template
一个字符串模板作为Vue实例的标识所用,模板将会替换挂载的元素,挂载元素的内容都将被忽略,除非模板的内容有分发插槽
如果 Vue 选项中包含渲染函数,模板将会被忽略
使用
.vue
单文件组件,<temptate></template>
标签中的内容会被渲染为 vue实例的 tempalte 属性对比:这个属性对应 react 组件中的 render 方法。
8. render
template 的 替代方案,在这里允许使用 jsx 语法,创建组件, render 函数由两个参数 createElement, context
对比:对应 react 中的 render 函数,但是又有些不同, 具体查看这里
9. components
包含 Vue 实例可用组件的哈希表,组件可以扩展 HTML 元素,封装可重用的代码
注册组件需要在初始化实例之前注册
<div class="home-basic-container" @click="handleClick"> <golbal-component></golbal-component> <local-component></local-component> </div>
// 全局注册 Vue.component('golbal-component', { template: '<div>this is golbal-component</div>' }); // 局部注册 const localComponent = { template: '<div>this is localComponent</div>' }; // 创建实例 new Vue({ el: '#app', components: { localComponent, // 局部注册,写在模板中可以是 小写 + ‘-’ 的格式 <local-component /> // golbal-component // 全局注册不用引入 } });
10. extends
允许声明扩展另一个组件
import HomeBasic from './HomeBasic'; export default { extends: HomeBasic, methods: { change() { // 覆盖掉 HomeBasic 组件中的 change 函数 this.text = 'on extend click'; console.log(this.text); }, } };
尝试在
.vue
单文件组件中继承另外一个单文件组件,只能继承到另一个组件的<script>
,<template>
和<style>
还需要手动添加引用,如果这个组件定义在一个.js
文件中,那么他所继承的就是一个完整的组件。对比:react 中组件间可以在创建时
class NewComponent extends OldComponent {}
这样来继承
11. mixins
mixins(混合) 是一种分发 Vue 组件中可复用功能的非常灵活的方式,混合对象可以包含任意组件选项
- 混合对象中如果有生命周期的钩子函数则会在 组件自身钩子之前调用
- 混合对象中值为对象的选项 如 methods components,将会被合并为同一个对象,键名冲突时以组件中定义的为准
- 如果有多个混合对象,且有键名冲突,则 优先级为 组件中键值对 > mixins属性中靠后的Mixin中的键值对 > mixins属性中靠前的Mixin中的键值对
const mixin1 = { created() { console.log('mixin created'); }, methods: { change() { console.log('mixin change'); }, log() { console.log('mixin1 log'); } } }; const mixin2 = { methods: { log() { console.log('mixin2 log'); } } }; export default { name: 'HomeBasic', mixins: [mixin1, mixin2], created() { console.log('self created'); }, methods: { handleClick() { this.change(); this.log(); }, change() { console.log('self change'); } } }; // mixin created // self created // self change // mixin2 log
对比:react 中原含有 mixin 后放弃,改为使用高阶组件实现同样功能
12. name
只有组件中有用,主要用于 组件自身递归调用以及方便调试
相关文章
- vue-cli-webpack模板配置全解析-1
- vue-cli-webpack模板配置全解析-2
- Vue 常用Api整理 1 - 组件属性与方法
- vue 常用Api整理 2 - 生命周期函数
- vue 常用Api整理 3 - 指令
- vue 常用Api整理 4
- vue-router使用整理
- vuex 使用整理
- Vue 常用API整理 1
- vue 常用Api整理 2
- vue 常用Api整理 3
- vue 常用Api整理 4
- vue常用api
- Ajax 常用api整理
- Ajax 常用api整理
- ehcache常用API整理
- ehcache常用API整理
- ehcache常用API整理
- ehcache常用API整理
- ehcache常用API整理
- 常用API类整理
- ehcache常用API整理
- socket api常用整理
- JAVA常用API整理
- Vue的一些API理解整理
- HTML5 Canvans 常用API整理
- 欢迎使用CSDN-markdown编辑器
- hibernate的入门的一个简单案例
- 键盘快捷键
- Java学习心得之数组
- 数据结构与C语言实现(五)——树(下):哈夫曼树与哈夫曼编码
- Vue 常用API整理 1
- 如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版】
- Int类型的集合类的设计实现
- 批量单变量求解 office wps 单变量求解比较
- 两两交换链表中的节点-LintCode
- Scala学习笔记-控制结构和函数(2)
- 171015chrony时间同步
- USB相关知识
- 一 python 运算符