# 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') ``` * 生命周期钩子 * ![生命周期钩子](https://v3.cn.vuejs.org/images/lifecycle.svg) ### 模板语法 * 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 则是被迭代的数组元素的别名。 ``` 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 指令在表单 \、\