diff --git "a/37\350\256\270\345\244\247\347\246\271/20230410-\347\273\204\344\273\266.md" "b/37\350\256\270\345\244\247\347\246\271/20230410-\347\273\204\344\273\266.md"
new file mode 100644
index 0000000000000000000000000000000000000000..6be54dccd803bdc185fde0e6ac505b3849bd69e8
--- /dev/null
+++ "b/37\350\256\270\345\244\247\347\246\271/20230410-\347\273\204\344\273\266.md"
@@ -0,0 +1,77 @@
+# Vue3组件
+
+组件可以扩展HTML元素,封装可重用的代码。
+
+## 全局组件实例
+```
+注册一个简单的全局组件runoob,并使用它:
+
+
+
+
+
+
+```
+再注册一个button-counter组件,在每次点击后,计数器会加1:
+```
+// 创建一个Vue 应用
+const app = Vue.createApp({})
+
+// 定义一个名为 button-counter 的新全局组件
+app.component('button-counter', {
+ data() {
+ return {
+ count: 0
+ }
+ },
+ template: `
+ `
+})
+app.mount('#app')
+
+```
+注意:template 中 ` 是反引号,不是单单引号 '。
+
+## 组件的复用
+将组件进行任意次数的复用:
+```
+
+
+
+
+
+```
+
+## 全局组件
+注册一个简单的全局组件runoob,并使用它:
+```
+
+
+
+
+
+
+```
+
diff --git "a/37\350\256\270\345\244\247\347\246\271/20230411-\347\273\204\344\273\2662.md" "b/37\350\256\270\345\244\247\347\246\271/20230411-\347\273\204\344\273\2662.md"
new file mode 100644
index 0000000000000000000000000000000000000000..097ee060424d157093b4a94cf3825c4241bc804e
--- /dev/null
+++ "b/37\350\256\270\345\244\247\347\246\271/20230411-\347\273\204\344\273\2662.md"
@@ -0,0 +1,143 @@
+# Vue3组件
+
+## 局部组件
+一个普通的JavaScript对象来定义组件:
+```
+const ComponentA = {
+ /* ... */
+}
+const ComponentB = {
+ /* ... */
+}
+const ComponentC = {
+ /* ... */
+}
+```
+在components选项中定义你想要使用的组件:
+```
+const app = Vue.createApp({
+ components: {
+ 'component-a': ComponentA,
+ 'component-b': ComponentB
+ }
+})
+```
+对于components对象中的每个属性来说,其属性名就是自定义元素的名字(component-a、component-b),其属性值就是这个组件的选项对象(ComponentA、ComponentB)。
+也可以在实例选项中注册局部组件,这样组件只能在这个实例中使用:
+```
+注册一个简单的局部组件 runoobA,并使用它:
+
+
+
+
+```
+
+## Prop
+prop是子组件用来接受父组件传递过来的数据的一个自定义属性。
+父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop":
+```
+
+
+
+
+
+
+
+```
+一个组件默认可以拥有任意数量的prop,任何值都可以传递给任何prop。
+
+### 动态Prop
+类似于用v-bind绑定HTML特性到一个表达式,也可以用v-bind动态绑定props的值到父组件的数据中。每当父组件的数据变化时,该变化也会传导给子组件:
+```
+
+
+
+
+
+```
+
+### Prop验证
+组件可以为props指定验证要求。
+定制prop的验证方式,可以为props中的值提供一个带有验证需求的对象,而不是一个字符串数组。例如:
+```
+Vue.component('my-component', {
+ props: {
+ // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
+ propA: Number,
+ // 多个可能的类型
+ propB: [String, Number],
+ // 必填的字符串
+ propC: {
+ type: String,
+ required: true
+ },
+ // 带有默认值的数字
+ propD: {
+ type: Number,
+ default: 100
+ },
+ // 带有默认值的对象
+ propE: {
+ type: Object,
+ // 对象或数组默认值必须从一个工厂函数获取
+ default: function () {
+ return { message: 'hello' }
+ }
+ },
+ // 自定义验证函数
+ propF: {
+ validator: function (value) {
+ // 这个值必须匹配下列字符串中的一个
+ return ['success', 'warning', 'danger'].indexOf(value) !== -1
+ }
+ }
+ }
+})
+```
+当prop验证失败的时候,(开发环境构建版本的)Vue将会产生一个控制台的警告。
\ No newline at end of file
diff --git "a/37\350\256\270\345\244\247\347\246\271/20230413-\350\256\241\347\256\227\345\261\236\346\200\247.md" "b/37\350\256\270\345\244\247\347\246\271/20230413-\350\256\241\347\256\227\345\261\236\346\200\247.md"
new file mode 100644
index 0000000000000000000000000000000000000000..cd835ec6394a59a529ca6464eead2de63a4dc38b
--- /dev/null
+++ "b/37\350\256\270\345\244\247\347\246\271/20230413-\350\256\241\347\256\227\345\261\236\346\200\247.md"
@@ -0,0 +1,99 @@
+# Vue3计算属性
+
+计算属性关键词: computed。
+计算属性在处理一些复杂逻辑时是很有用的。
+反转字符串的例子:
+```
+
+ {{ message.split('').reverse().join('') }}
+
+```
+
+使用了计算属性的实例:
+```
+
+
+
+
+Vue 测试实例 - 百度知道(baidu.com)
+
+
+
+
+
原始字符串: {{ message }}
+
计算后反转字符串: {{ reversedMessage }}
+
+
+
+
+
+```
+上述声明了一个计算属性reversedMessage 。
+提供的函数将用作属性vm.reversedMessage的getter 。
+vm.reversedMessage 依赖于 vm.message,vm.message发生改变时,vm.reversedMessage也会更新。
+
+## computed vs methods
+可以使用methods来替代computed,效果上两个都是一样的,但是computed是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods,在重新渲染的时候,函数总会重新调用执行。
+```
+methods: {
+ reversedMessage2: function () {
+ return this.message.split('').reverse().join('')
+ }
+}
+```
+computed性能会更好,但是如果不希望缓存,可以使用methods属性。
+
+## computed setter
+computed属性默认只有getter ,不过在需要时你也可以提供一个setter :
+```
+const app = {
+ data() {
+ return {
+ name: 'Google',
+ url: 'http://www.google.com'
+ }
+ },
+ computed: {
+ site: {
+ // getter
+ get: function () {
+ return this.name + ' ' + this.url
+ },
+ // setter
+ set: function (newValue) {
+ var names = newValue.split(' ')
+ this.name = names[0]
+ this.url = names[names.length - 1]
+ }
+ }
+ }
+}
+vm = Vue.createApp(app).mount('#app')
+document.write('name: ' + vm.name);
+document.write('
');
+document.write('url: ' + vm.url);
+document.write('
------ 更新数据 ------
');
+// 调用 setter, vm.name 和 vm.url 也会被对应更新
+vm.site = 'https://www.baidu.com';
+document.write('name: ' + vm.name);
+document.write('
');
+document.write('url: ' + vm.url);
+```
+从实例运行结果看在运行vm.site = 'http://www.baidu.com'; 时,setter会被调用,vm.name和vm.url也会被对应更新。
\ No newline at end of file
diff --git "a/37\350\256\270\345\244\247\347\246\271/20230414-\347\233\221\345\220\254\345\261\236\346\200\247.md" "b/37\350\256\270\345\244\247\347\246\271/20230414-\347\233\221\345\220\254\345\261\236\346\200\247.md"
new file mode 100644
index 0000000000000000000000000000000000000000..502a40e17d7c86563976d21c192172332fda9b8c
--- /dev/null
+++ "b/37\350\256\270\345\244\247\347\246\271/20230414-\347\233\221\345\220\254\345\261\236\346\200\247.md"
@@ -0,0 +1,103 @@
+# Vue3监听属性
+
+
+使用watch实现计数器:
+```
+
+
计数器: {{ counter }}
+
+
+
+
+```
+进行千米与米之间的换算:
+```
+
+ 千米 :
+ 米 :
+
+
+
+```
+以上代码中创建了两个输入框,data 属性中,kilometers和meters初始值都为0。watch对象创建了data对象的两个监控方法:kilometers 和 meters。
+再输入框输入数据时,watch 会实时监听数据变化并改变自身的值。
+
+## 异步加载中使用watch
+异步数据的加载Vue通过watch选项提供了一个更通用的方法,来响应数据的变化。
+```
+
+
+
+```