# keepeact
**Repository Path**: aHon00/keepeact
## Basic Information
- **Project Name**: keepeact
- **Description**: tsx/diff/vdom
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2022-05-11
- **Last Updated**: 2022-06-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 简介
[keepeact](https://github.com/wxyhahaha/keepeact) 是一个由 `typescript` 和 `vue.js 3.x` 数据检测机制结合而成的小型框架,写法结合现代 `jsx`,`class-style` 写法,内置 `diff` 算法和批量更新策略优化了渲染效率,打包工具为 vite,能提供较好的开发环境简单,易上手,如果想为 jq 栈提供一套简单组件 `ui`,或者其他框架也可使用它
# demo 一览
```tsx
import { ValueComponent, Component } from 'keepeact';
@Component()
export default class Button extends ValueComponent {
render() {
return ;
}
}
```
# 开始
```bash
yarn keept-cli -g
```
或
```bash
npm install keept-cli -g
```
# 创建安装
```bash
kp create [filename]
&
yarn
```
# 生命周期
生命周期包含了 `constructor` `writeValue` `created` `beforeMount` `mounted` `updated` `destroy`;
- **constructor** 是指该组件实例化时调用
- **writeValue** 是提供给外部传入 `value` 时,可接受 `value` 的 回调函数,实例化后调用
- **created** 当声明的属性完成数据监测时调用
- **beforeMount** 当真实 `dom` 挂载之前
- **mountd** 调用 `render`,真实 `dom` 挂载之后调用
- **updated** 当响应数据更新之后调用
- **destroy** 当组件被卸载销毁时调用
# 响应式与非响应
## 绑定属性
```tsx
...
export default class Button extends ValueComponent {
text = 'button'; // 此处完成绑定,该值变动会引起render的执行
render() {
return ;
}
}
```
## 响应式数据类型
除了 `Set` `Map` `weakSet` `weakMap` 数据结构外,可对普通对象,数组和其他简单类型进行响应式追踪;
此外,针对非响应式数据,还提供了 update 方法,手动更新界面;
```tsx
import { ValueComponent, Component, ChangeDetectionStrategy } from 'keepeact';
@Component()
export default class Button extends ValueComponent {
text = 'button';
set = new Set();
mounted() {
this.set.add(1);
this.update();
}
render() {
console.log(this.set); // Set([1])
return ;
}
}
```
## 非响应式
组件提供了两种更新策略, `自动更新(Default)` 和 `手动更新(Onpush)`,可供用户自由选择,更自由掌控数据响应,默认时 `Default` 模式
```tsx
...
@Component({
changeDetection: ChangeDetectionStrategy.Onpush // 开启Onpush时,全部数据将手动
})
export default class Button extends ValueComponent {
text = 'button';
mounted() {
this.text = 'button1';
this.update();
}
render() {
return ;
}
}
```
## 对象方法
已经对`push`/`pop`/`shift`/`unshift` 数组方法进行劫持。并且可在 `render` 函数中使用 `includes`/`indexOf` 查询方法,对应的数据发生改变也可响应;
```tsx
...
export default class Button extends ValueComponent {
text = 'button';
mounted() {
this.text = 'button1';
}
render() {
console.log(this.text.includes('1')); // 第二次运行 true
return ;
}
}
```
# class 和 style 绑定
```tsx
```
对应的html
```html
```
# 计算属性和侦听器
## 计算属性
```tsx
...
export default class Button extends ValueComponent {
count = 0;
count1 = 1;
get computeCount() {
return this.count + this.count1;
}
render() {
return ;
}
}
```
但上面方式对于性能并不是最优的,因为它没有缓存,也就是读取 `computeCount` 函数都会执行一遍,推荐用 `computed` 函数计算,暂时的唯一缺点就是访问时需要访问成员 `value` ,不过后续会考虑自动脱 `value`
```tsx
import { ValueComponent, Component } from 'keepeact';
@Component()
export default class Button extends ValueComponent {
count = 0;
count1 = 1;
computeCount = computed(() => this.count + this.count1);
render() {
return ;
}
}
```
## 侦听器
推荐使用 `@Watch` 装饰器
```tsx
import { ValueComponent, Component, Watch } from 'keepeact';
@Component()
export default class Button extends ValueComponent {
count = 0;
@Watch('count')
countChange(oldValue, newValue) {
console.log('oldValue:', oldValue);
console.log('newValue:', newValue);
}
mounted() {
this.count++;
}
render() {
return ;
}
}
```
# 访问Dom元素
访问元素可使用 `@Ref` 或者 `$refs`
```tsx
import { ValueComponent, Component, Ref } from 'keepeact';
@Component()
export default class Button extends ValueComponent {
count = 0;
@Ref('button') buttonEl: HTMLElement;
mounted() {
this.$nextTick(() => {
console.log(this.buttonEl);
console.log(this.$refs['button'])
});
}
render() {
return ;
}
}
```
# 组件通讯
## props
访问外部传进的数据可以使用 `@Prop` 接收,或者 `$props`
```tsx
// child
import { ValueComponent, Component, Prop } from 'keepeact';
@Component()
export default class Child extends ValueComponent {
@Prop() count;
render() {
console.log(this.$props); // { count: 1}
return ;
}
}
```
```tsx
// parent
import { ValueComponent, Component, Prop } from 'keepeact';
@Component()
export default class Parent extends ValueComponent {
count = 1;
render() {
return ;
}
}
```
## 事件
DOM元素上绑定事件
```tsx
import { ValueComponent, Component, Prop } from 'keepeact';
@Component()
export default class Button extends ValueComponent {
count = 0;
render() {
return ;
}
}
```
同样的事件还有 `onChange`/`onInput`
### valueChange
```tsx
// Child
import { ValueComponent, Component, Prop } from 'keepeact';
@Component()
export default class Child extends ValueComponent {
count = 0;
render() {
return ;
}
}
```
```tsx
// Parent
import { ValueComponent, Component, Prop } from 'keepeact';
@Component()
export default class Parent extends ValueComponent {
render() {
return {
console.log(e); // count:1 count:2 count:3
}}>;
}
}
```
# 导出使用
切记要声明 `@Component` 装饰器,因为他封装了一个 `create` 方法,便于用户将组件挂载到真实 `Dom` 上
```tsx
import { ValueComponent, Component } from 'keepeact';
@Component() // 注意要加上
export default class Button extends ValueComponent {
text = 'button';
render() {
return ;
}
}
```
```ts
import Button from './src/components/button';
Button.create(el, {} /*props*/);
```