文章目录
- vue介绍
- vue 入门
- 简单示例
- 自定义组件
- 事件
vue介绍
vue2 官网
- Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。
- Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层。
vue 入门
- Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统。
- v-bind attribute 被称为指令,指令带有前缀 v-,以表示它们是 Vue 提供的特殊 attribute,简写,例如
:id="message"
将元素节点的 id 属性 和 vue 实例的 message 属性的内容保持一致 - v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。
- v-on 指令添加一个事件监听器。
<template>
元素当做不可见的包裹元素,并在上面使用 v-if。最终的渲染结果将不包含<template>
元素.
简单示例
- 当创建一个 Vue 实例时,你可以传入一个选项对象,选项对象文档
- 一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实例,以及可选的嵌套的、可复用的组件树组成
- 当一个 Vue 实例被创建时,它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值,当这些数据改变时,视图会进行重渲染
- Vue 实例还暴露了一些有用的实例 property 与方法。它们都有前缀 $,以便与用户定义的 property 区分开来,实例 property 和方法的列表
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
{{message}} {{message + message}}
<div :id="message"></div>
<ul>
<li v-for="item in list">
<span v-if="!item.del">{{item.title}}</span>
<span v-else style="text-decoration: line-through">{{item.title}}</span>
<button v-show="!item.del">删除</button>
</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// // 创建一个 Vue 实例
var vm = new Vue({
el: '#app',
data: {
message: 'hello world',
list: [{
title: '课程1',
del: false
}, {
title: '课程2',
del: true
}],
}
})
</script>
</body>
</html>
PS: 在浏览器控制台上可以通过 vm 获取数据(代码vue实例挂再在vm上),也可以修改相关的变量值
自定义组件
在 Vue 里,一个组件本质上是一个拥有预定义选项的一个 Vue 实例
- 组件API
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
{{message}} {{message + message}}
<div :id="message"></div>
<!--
<ul>
创建一个 todo-item 组件的实例
<todo-item v-for="item in list" :title="item.title" :del="item.del"></todo-item>
</ul>
-->
<todo-list></todo-list>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 定义名为 todo-item 的新组件
Vue.component('todo-item', {
// 声明能接收的参(属)数(性)
props: {
title: String,
del: {
type: Boolean,
default: false,
},
},
// 复用html代码
template:
`
<li>
<span v-if="!del">{{ title }}</span>
<span v-else style="text-decoration: line-through">{{ title }}</span>
<button v-show="!del">删除</button>
</li>
`,
data: function () {
return {}
},
methods: {},
})
// 定义名为 todo-list 的新组件
Vue.component('todo-list', {
template:
`
<ul>
<todo-item v-for="item in list" :title="item.title" :del="item.del"></todo-item>
</ul>
`,
data: function () {
return {
list: [{
title: '课程1',
del: false
}, {
title: '课程2',
del: true
}],
}
}
})
var vm = new Vue({
el: '#app',
data: {
message: 'hello world',
}
})
</script>
</body>
</html>
事件
- 事件APi
- 自定义事件
- 在 Vue.js 中,v-on:my-event 的简写方式是 @my-event,@xxx 进行事件绑定(简写形式)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
{{message}} {{message + message}}
<div :id="message"></div>
<!-- <ul>
<todo-item v-for="item in list" :title="item.title" :del="item.del"></todo-item>
</ul> -->
<todo-list></todo-list>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
Vue.component('todo-item', {
props: {
title: String,
del: {
type: Boolean,
default: false,
},
},
template:
`
<li>
<span v-if="!del">{{ title }}</span>
<span v-else style="text-decoration: line-through">{{ title }}</span>
<button v-show="!del" @click="handleClick">删除</button>
</li>
`,
data: function () {
return {}
},
methods: {
handleClick(e) {
console.log('点击删除按钮')
// $emit 事件告诉上层(父组件))
this.$emit('delete', this.title)
}
},
})
Vue.component('todo-list', {
// @delete 的方式来绑定一个用来接收 delete事件的方法
template:
`
<ul>
<todo-item @delete="handleDelete" v-for="item in list" :title="item.title"
:del="item.del"></todo-item>
</ul>
`,
data: function () {
return {
list: [{
title: '课程1',
del: false
}, {
title: '课程2',
del: true
}],
}
},
methods: {
// 子组件触发 delete 事件,父组件接收到事件,执行相应的方法
handleDelete(val) {
console.log('handleDelete', val)
}
}
})
var vm = new Vue({
el: '#app',
data: {
message: 'hello world',
}
})
</script>
</body>
</html>