# learn-vue
**Repository Path**: fcourage/learn-vue
## Basic Information
- **Project Name**: learn-vue
- **Description**: No description available
- **Primary Language**: HTML
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-12-05
- **Last Updated**: 2021-12-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# learn-vue
## 自己的感悟
* 从信息论的角度来看,vue框架统一三种技术:
* 存储信息:定义变量
* 展示信息:HTML模板变量
* 修改信息:
* Script中的逻辑运算(函数),交互事件处理
* @keydown.enter="addTodo"
* @click="clear"
* 计算属性:不直接使用变量数据,而是在此变量的基础上有些逻辑运算
`let all = computed(() => todos.value.length);`
* CSS定义了一个响应式变量
``
* 传输信息:
变量和模板直接Vue框架帮助更新,数据变化驱动页面变化
1. 响应式变量
```
import { ref } from "vue";
let count = ref(1)
```
2. \ 中的 v-mode
` `
3. 通过 defineProps 定义了传递数据的格式,通过 defineEmits 定义了监听的函数,
## [Vue3基础](https://v3.cn.vuejs.org/guide/introduction.html)
### Vue.js 是什么
* Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统
* v-bind:将这个元素节点的 title attribute 和当前活跃实例的 message property 保持一致
* v-on: 指令添加一个事件监听器,通过它调用在实例中定义的方法
* v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定
* v-if="seen"
* v-for 指令可以绑定数组的数据来渲染一个项目列表
* Vue应用和组件,在一个大型应用中,有必要将整个应用程序划分为多个组件,以使开发更易管理。
* 在 Vue 中,组件本质上是一个具有预定义选项的实例。
* 在 Vue 中注册组件很简单:如对 App 对象所做的那样创建一个组件对象,并将其定义在父级组件的 components 选项中:
```
const TodoItem = {
template: `
This is a todo`
}
// 创建 Vue 应用
const app = Vue.createApp({
components: {
TodoItem // 注册一个新组件
},
... // 组件的其它 property
})
// 挂载 Vue 应用
app.mount(...)
```
### 应用 & 组件实例
* 每个 Vue 应用都是通过用 createApp 函数创建一个新的应用实例开始的
* 根组件
* 传递给 createApp 的选项用于配置根组件。当我们挂载应用时,该组件被用作渲染的起点。
```
const RootComponent = {
/* 选项 */
}
const app = Vue.createApp(RootComponent)
const vm = app.mount('#app')
```
* 生命周期钩子
* 
### 模板语法
* Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层组件实例的数据。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析。
* 双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用v-html 指令
* ``如果绑定的值是 null 或 undefined,那么该 attribute 将不会被包含在渲染的元素上。
* 提供了完全的 JavaScript 表达式支持
* 指令
* v-if 指令将根据表达式 seen 的值的真假来插入/移除 元素
`
现在你看到我了
`
* 一些指令能够接收一个“参数”,在指令名称之后以冒号表示。
* ` ... `
* 在这里 href 是参数,告知 v-bind 指令将该元素的 href attribute 与表达式 url 的值绑定。
* 动态参数
* 在指令参数中使用 JavaScript 表达式,方法是用方括号括起来
* ` ... `
* 这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。
* 缩写
* v-bind 缩写
```
...
...
...
```
* v-on 缩写
```
...
...
...
```
### Data Property 和方法
* property
* 组件的 data 选项是一个函数,返回一个对象,对象的属性可以在模板中使用。
* data函数返回一个对象,然后 Vue 会通过响应性系统将其包裹起来,并以 $data 的形式存储在组件实例中
```
const app = Vue.createApp({
data() {
return { count: 4 }
}
})
const vm = app.mount('#app')
console.log(vm.$data.count) // => 4
console.log(vm.count) // => 4
// 修改 vm.count 的值也会更新 $data.count
vm.count = 5
console.log(vm.$data.count) // => 5
// 反之亦然
vm.$data.count = 6
console.log(vm.count) // => 6
```
### 计算属性和侦听器
* 对于任何包含响应式数据的复杂逻辑,你都应该使用计算属性
```
Has published books:
{{ publishedBooksMessage }}
Vue.createApp({
data() {
return {
author: {
name: 'John Doe',
books: [
'Vue 2 - Advanced Guide',
'Vue 3 - Basic Guide',
'Vue 4 - The Mystery'
]
}
}
},
computed: {
// 计算属性的 getter
publishedBooksMessage() {
// `this` 指向 vm 实例
return this.author.books.length > 0 ? 'Yes' : 'No'
}
}
}).mount('#computed-basics')
```
### Class 与 Style 绑定
操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是 attribute,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可。不过,字符串拼接麻烦且易错。因此,在将 v-bind 用于 class 和 style 时,Vue.js 做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组。
* 绑定 HTML Class
* 我们可以传给 :class (v-bind:class 的简写) 一个对象,以动态地切换 class
```
```
* 绑定内联样式
```
data() {
return {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
}
```
### 条件渲染
* v-if
* 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 truthy 值的时候被渲染。
```
A
B
C
Not A/B/C
```
* v-show
* 另一个用于条件性展示元素的选项是 v-show 指令。不同的是带有 v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 display CSS property
### 列表渲染
* 用 v-for 把一个数组映射为一组元素
* v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名。
```
-
{{ parentMessage }} - {{ index }} - {{ item.message }}
Vue.createApp({
data() {
return {
parentMessage: 'Parent',
items: [{ message: 'Foo' }, { message: 'Bar' }]
}
}
}).mount('#array-with-index')
```
* 显示过滤/排序后的结果
```
{{ n }}
data() {
return {
numbers: [ 1, 2, 3, 4, 5 ]
}
},
computed: {
evenNumbers() {
return this.numbers.filter(number => number % 2 === 0)
}
}
```
### 事件处理
* 我们可以使用 v-on 指令 (通常缩写为 @ 符号) 来监听 DOM 事件,并在触发事件时执行一些 JavaScript。用法为 v-on:click="methodName" 或使用快捷方式 @click="methodName"
```
Vue.createApp({
data() {
return {
name: 'Vue.js'
}
},
methods: {
greet(event) {
// `methods` 内部的 `this` 指向当前活动实例
alert('Hello ' + this.name + '!')
// `event` 是原生 DOM event
if (event) {
alert(event.target.tagName)
}
}
}
}).mount('#event-with-method')
```
* 事件修饰符
```
...
...
```
### 表单输入绑定
* 基础用法
* 你可以用 v-model 指令在表单 \、\