将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.依赖注入

使用webview.写一个网页,放在hybrid/html目录下,在html中引入jsbridge文件,用于调用uniapp的api.

如何传递值给html呢?这也有两种解决方案:
1.使用url拼接,这种解决方案最好将值用encodeURIComponent()函数将值编码一下,以免解析时被分割。
2.使用h5+ api向页面中注入js代码,实现值传递.

创建webview的时机:
可在APP的onLaunch事件中创建,保证在首页页面加载完成前就将webview创建好。

目前该方案已经应用到 任意门APP ( http://schoolhelper.douyeblog.top/ ) 上了

1.安装ffmpeg
在官网下载ffmepg对应的版本 官网
github下载地址
图片
2.将ffmpeg添加到环境变量
解压,将解压后得到的bin目录添加到环境变量图片2
图片3
3.下载并安装screen-capture-recorder-to-video
windows版本github下载地址
图片4
4.录屏
(1).可以使用桌面上的快捷方式录屏图片5
(2).也可以使用ffmpeg命令录屏
打开cmd命令行窗口输入:

ffmpeg -list_devices true -f dshow -i dummy

可以看到多了两个虚拟设备
图片6
执行命令:

 ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -f flv 目录 或者推流
ffmpeg -f gdigrab -i desktop -f dshow -i audio="virtual-audio-capturer"  -vcodec h264 -acodec aac -f flv  地址

即可开启录屏。(建议使用mkv格式,会比较清晰)