vue初始学习

本文详细讲解了Vue.js中的MVVM模式,包括Model、View和ViewModel的关系,以及如何通过Vue实例实现数据双向绑定。同时涵盖了Vue2.x和3.x版本的区别,以及核心功能如声明式渲染、组件化开发、v-model表单绑定和组件注册使用的详细指南。
MVVM
M - Model,数据

V - View,视图

VM - ViewModel,关联 Model 与 View,实现数据双向绑定:View 的变动会自动反映到 ViewModel,ViewModel 会自动通知 Model 更新,反之,Molde 的变化也会自动反映到 ViewModel 中,ViewModel 会通知 View 实现重新渲染。

Vue
官网

尤雨溪

现行两种版本:v2.x 与 v3.x,目前 3.x 的版本成为了默认版本。

渐进式 JavaScript 框架

兼容性:Vue 2.x 不支持 IE8 及以下版本,因为 Vue2.x 使用了 IE8 无法模拟的 ECMAScript 5 特性(Object.defineProperty())

安装
使用 <script src=""> 方式在页面中引入
开发版本:包含完整的警告和调试模式

生产版本:经过压缩混淆,删除了警告等信息,有更小的体积

npm install
Vue CLI
声明式渲染
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统

Vue 实例
var vm = new Vue({
  // 选项对象 option
  el: '', // element
  data: { // 是在模板语法中需要处理渲染的数据
    message: ''
  },
  methods: { // 是在 vue 实例中需要调用到的一些方法
    methodName() {}
  }
})
说明:

data 是需要在模板中渲染处理的数据
添加到 data 中的各属性(字段)会被自动挂载到创建的 vue 实例下(但以 $ 或 _ 开头的不会被挂载到 vue 实例下)
创建的 vue 实例中可以使用 $data 获取到选项中 data 对象的引用
创建的 vue 实例中可以使用 $options 获取到选项对象
创建的 vue 实例中可以调用 $el 获取到渲染后的 DOM 节点
添加到 methods 中的各方法会被自动挂载到 vue 实例下,在方法中的 this 指向的是当前所创建的 Vue 实例本身
模板语法
Vue.js 使用了基于 HTML 的模板语法

插值
文本
数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值

<div>
  {{ JS expression }}
</div>
注意,{{ exp }} 内部添加的是 JS 的表达式,如:{{ 5 }}{{ message }}{{ 3 + 2 - 5 * 0 }},不能使用如 if-else、while 等语句。

{{ exp }} 不会解析 html 文本内容,而是会将 html 文本转义为普通文本渲染。目的是避免 XSS 攻击。

**v-text 指令:**渲染普通文本

原始 html
要渲染原始 html,使用 v-html 指令:

<div v-html="htmlText">
</div>
请只对可信内容使用 HTML 插值,绝不要对用户提供的内容使用插值(v-html)。

属性(Attribute)
使用 v-bind 指令来动态绑定属性值:在绑定属性值时,不能使用 {{}} 语法。

v-bind 可以缩写为 :,如:

<div v-bind:title="title">这是一个 div</div>
<div :title="title">这是一个 div</div>
指令
指令 (Directives) 是带有 v- 前缀的特殊 attribute(是在标签中添加的有特殊意义的属性,这个属性以 v- 开头),指令值是一个 JS 表达式。

指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。

参数:
是在 指令名称 后使用 : 连接的。

所有指令:
文本与html渲染:

v-text:更新元素的 textContent
v-html:更新元素的 innerHTML
**条件渲染:**根据条件显示/隐藏元素,通常布尔值 true 表示显示、false 表示隐藏

v-show:
v-if:
v-else-if:
v-else:
列表渲染:

v-for:循环列表渲染
事件绑定:

v-on:绑定事件,可缩写为 @
属性绑定:

v-bind:动态绑定标签的属性值,可缩写为 :
双向绑定:

v-model:表单双向绑定
插槽:

v-slot:
其它:

v-pre:
v-cloak:这个指令保持在元素上直到关联实例结束编译。通常将这个指令与 CSS 规则结合一起使用:[v-cloak] { display: none; },可以隐藏未编译的 Mustache 标签直到实例准备完毕。(解决从未编译显示html模板到编译完毕显示渲染结果之间的闪烁效果)。
v-once:只渲染一次
计算属性(computed)
模板内的表达式应该是进行简洁运算操作,如果运算逻辑比较复杂,就可以使用 计算属性 来实现。

在选项对象中,使用 computed 字段来表示计算属性。

const options = {
    completedCount: { // 已完成数量
        get() {
            return this.todos.reduce((result, todo) => todo.completed ? result + 1 : result, 0)
        },
    },
    // 可简写为
    // completedCount() { // 已完成数量
    //   return this.todos.reduce((result, todo) => todo.completed ? result + 1 : result, 0)
    // },
}
计算属性(computed) VS 方法(methods)(面试)
计算属性有缓存,而方法没有缓存(计算属性是基于它们的响应式依赖进行缓存的),即只要依赖项不发生变化,计算属性就会一直使用之前运算的结果,而调用方法将总会再次执行函数。
计算属性通常是无副作用的,而方法中可以包含副作用操作(如:发送网络请求)
侦听属性(watch)
Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。

在选项对象中使用 watch 来表示。

当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

条件渲染
v-if、v-show、v-else-if、v-else

v-if 与 v-show 区别(面试):
v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。(v-if 操作的是 DOM 节点的销毁与重建)

v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。(v-show 操作的是节点的 css 属性中的 display)

一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

列表渲染
v-for

数组更新
变更方法
push() / pop()
unshift() / shift()
splice()
sort() / reverse()
调用这些方法后,原数组本身会受影响,所以视图会响应式渲染

替换数组
当调用非变更方法时,可以使用新数组替换旧数组,来实现渲染

v-for 与 v-if 一起使用(面试)
注意我们不推荐在同一元素上使用 v-if 和 v-for

Vue2.x 中当它们处于同一节点,v-for 的优先级比 v-if 更高,Vue3.x 中当它们处于同一节点,v-if 的优先级比 v-for 更高

事件处理
在事件指令值中直接书写表达式
引用事件方法名称
内联处理器中调用方法,显式传递参数,可以用特殊变量 $event 把它传入方法,在方法体内部就可以使用到事件event对象了
事件修饰符:
.stop - 阻止事件传播
.prevent - 阻止默认行为
表单输入绑定
v-model

创建双向数据绑定

v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

v-model 在内部为不同的输入元素使用不同的 property 并抛出不同的事件:

text 和 textarea 元素使用 value property 和 input 事件;
checkbox 和 radio 使用 checked property 和 change 事件;
select 字段将 value 作为 prop 并将 change 作为事件。
组件化应用构建
组件系统:它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用

在 Vue 里,一个组件本质上是一个拥有预定义选项的一个 Vue 实例

定义并使用组件
定义选项对象
const options = {
  template: '', // 视图模板
  data() {
    return {}
  },
  computed: {},
  methods: {},
}
template 定义的是组件的视图模板,在 template 中应该使用唯一的单个根元素包裹布局结构
data 必须是一个函数**(面试)**,在函数体内部返回一个普通对象
注册组件
全局注册:

Vue.component(componentName, options)
局部注册:

使用组件
使用组件名称作为自定义标签名,在模板中引用标签
<think>好的,我现在需要处理用户在Vue初始化Canvas的问题,并且根据提供的引用内容来构建回答。首先,用户需要示例代码和常见问题解决,所以我得整理一个清晰的步骤。 首先,我应该参考用户提供的引用,特别是引用[2]和引用[4],因为它们提到了Vue3中使用Canvas的示例。用户可能使用的是Vue3,所以示例代码应该基于Vue3的Composition API,比如使用setup语法和ref来引用Canvas元素。 然后,我需要确保示例代码正确初始化Canvas。根据引用[2]中的代码,使用ref获取canvas元素,并在onMounted生命周期钩子中获取上下文进行绘制。这样能确保DOM已经挂载,避免访问不到Canvas的情况。 接下来,常见问题方面,用户提到了花屏现象,这在引用[1]中是通过v-cloak解决的。不过这里的Canvas初始化可能不会有这样的问题,但可能需要考虑其他方面,比如Canvas渲染时机。如果在Vue中,确保在mounted或onMounted之后操作Canvas,避免在组件未挂载时访问DOM元素。 另外,引用[3]提到组件完全初始化后执行操作,使用mounted钩子,所以在示例中需要强调这一点。同时,用户可能需要知道如何响应窗口变化,比如监听resize事件并重新绘制Canvas,这也是常见的问题之一。 还需要考虑清除Canvas内容的方法,如引用[2]中的clearRect函数,这可能是一个常见操作,应该包含在示例中。此外,绘图上下文可能为null的情况,需要处理错误,避免运行时错误。 最后,生成相关问题时要围绕Vue和Canvas的结合使用,比如生命周期钩子的使用、响应式处理、性能优化等。确保问题覆盖用户可能遇到的其他问题,帮助他们进一步学习。</think>### Vue3中Canvas初始化示例及常见问题 #### 1. Canvas基础初始化示例 ```vue <template> <div> <canvas ref="canvasRef" width="600" height="400" style="border:1px solid #ccc"></canvas> </div> </template> <script setup> import { ref, onMounted } from 'vue'; const canvasRef = ref(null); onMounted(() => { const canvas = canvasRef.value; const ctx = canvas.getContext('2d'); // 检查上下文是否获取成功 if (!ctx) { console.error('无法获取Canvas上下文'); return; } // 绘制初始内容 ctx.fillStyle = '#4CAF50'; ctx.fillRect(50, 50, 200, 150); }); </script> ``` **关键点说明**: - 使用`ref`绑定Canvas元素引用[^2] - 在`onMounted`生命周期确保DOM已挂载[^3] - 添加上下文存在性检查避免空指针错误 #### 2. 常见问题解决方案 **问题1:Canvas内容不显示** ```javascript // 正确获取上下文方式 const ctx = canvas.getContext('2d'); // 错误示例:在created生命周期操作DOM ``` **解决方法**: 所有Canvas操作必须在`onMounted`/`mounted`之后执行[^3] **问题2:高分屏模糊** ```javascript // 处理设备像素比 const dpr = window.devicePixelRatio || 1; canvas.width = canvas.clientWidth * dpr; canvas.height = canvas.clientHeight * dpr; ctx.scale(dpr, dpr); ``` **问题3:动态尺寸适配** ```javascript // 监听窗口变化 window.addEventListener('resize', () => { canvas.width = canvas.clientWidth; canvas.height = canvas.clientHeight; redrawCanvas(); // 需要重新绘制内容 }); ``` #### 3. 扩展功能示例:清空画布 ```vue <template> <button @click="clearCanvas">清空画布</button> </template> <script setup> const clearCanvas = () => { const ctx = canvasRef.value.getContext('2d'); ctx.clearRect(0, 0, canvasRef.value.width, canvasRef.value.height); }; </script> ``` 该实现参考了Canvas基础清除方法[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值