分类 "学习足迹" 下的文章

将Ref作为参数传递

编写组合式函数
例子:

//简单函数
function add(a:number,b:number){
   return a+b
}

//接受Ref,得到了响应式结果,链接起来了
function add(a:Ref<number>,b:Ref<number>){
   return computed(()=>a.value+b.value)
}

//优化改造,同时接收纯值和ref值
function add(a:Ref<number>|number,b:Ref<number>|number){
   return computed(()=>unref(a)+unref(b))
}

ref 和 unref 的内部实

ref.png
unref.png

MaybeRef

类型工具

type MaybeRef<T> = Ref<T>|T

MaybeRef.png
MaybeRefEgg.png

deep.png

MaybeComputedRef

//可能是一个Ref,一个字面值,或者一个Getter函数
export type MaybeComputedRef<T> = MaybeRef<T>|(()=>T)|ComputedRef<T>

resolveRef

//如果传入的是一个函数,我们使用computed()创建一个ref对象,否则交由ref()处理
function resolveRef<T>(input:MaybeRef<T>):ref<T>{
   return typeof input==='function'?computed(input):ref<input>
}

resoveUnref

function resolveUnref<T>(input:MaybeRef<T>):T{
   return typeof input==="function"?input():unref(input)
}

副作用清除

副作用清除.png
副作用清除2.png
watch手动清除.png
副作用手动清除.png
vue3.1 scope.png
onScopeDispose.png

1.
应用配置
应用实例会暴露一个 .config 对象允许我们配置一些应用级的选项,例如定义一个应用级的错误处理器,用来捕获所有子组件上的错误:

app.config.errorHandler = (err) => {
  /* 处理错误 */
}

2.
动态绑定多个值

const objectOfAttrs = {
  id: 'container',
  class: 'wrapper'
}
<div v-bind="objectOfAttrs"></div>

3.
受限的全局访问
模板中的表达式将被沙盒化,仅能够访问到有限的全局对象列表。该列表中会暴露常用的内置全局对象,比如 Math 和 Date。
没有显式包含在列表中的全局对象将不能在模板内表达式中访问,例如用户附加在 window 上的属性。然而,你也可以自行在 app.config.globalProperties 上显式地添加它们,供所有的 Vue 表达式使用。

4.内置指令

  1. 动态参数
<!--
注意,参数表达式有一些约束,
参见下面“动态参数值的限制”与“动态参数语法的限制”章节的解释
-->
<a v-bind:[attributeName]="url"> ... </a>

<!-- 简写 -->
<a :[attributeName]="url"> ... </a>

6.
可写计算属性

<script setup>
import { ref, computed } from 'vue'

const firstName = ref('John')
const lastName = ref('Doe')

const fullName = computed({
  // getter
  get() {
    return firstName.value + ' ' + lastName.value
  },
  // setter
  set(newValue) {
    // 注意:我们这里使用的是解构赋值语法
    [firstName.value, lastName.value] = newValue.split(' ')
  }
})
</script>

7.副作用
纯函数
(1)、如果函数的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数。
(2)、该函数不会产生任何可观察的副作用,例如网络请求,输入和输出设备或数据突变(mutation)

8.
类与样式的绑定注意
对于只有一个根元素的组件,当你使用了 class attribute 时,这些 class 会被添加到根元素上并与该元素上已有的 class 合并。

如果你的组件有多个根元素,你将需要指定哪个根元素来接收这个 class。你可以通过组件的 $attrs 属性来实现指定:

<MyComponent class="baz" />

<!-- MyComponent 模板使用 $attrs 时 -->
<p :class="$attrs.class">Hi!</p>
<span>This is a child component</span>

9.生命周期

10.watchEffect()

11.函数模板引用
除了使用字符串值作名字,ref attribute 还可以绑定为一个函数,会在每次组件更新时都被调用。该函数会收到元素引用作为其第一个参数:

<input :ref="(el) => { /* 将 el 赋值给一个数据属性或 ref 变量 */ }">

注意我们这里需要使用动态的 :ref 绑定才能够传入一个函数。当绑定的元素被卸载时,函数也会被调用一次,此时的 el 参数会是 null。你当然也可以绑定一个组件方法而不是内联函数。

12.透传Attributes

13.插槽

14.依赖注入

使用 for 对象名 in 语句。
语法如下:

for(var 变量 in 对象){

}

对象中的属性数量决定了for循环的执行次数。属性名会赋值给“变量”。取值用 obj[变量]。(由于变量的特殊性)。

分类
内建对象:
ES标准中定义的对象,在任何的ES实现中都可以使用。如Math,String,Number,Object等
宿主对象:
在js的运行环境中提供的对象,如浏览器提供的对象。如DOM,BOM等。
自建对象:
由开发人员创建的。