Skip to content

Commit f4a602a

Browse files
committed
feat: 实现Sibling基本功能
1 parent e080f8c commit f4a602a

7 files changed

Lines changed: 128 additions & 2 deletions

File tree

index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import {AppRegistry} from "react-native"
2+
import WrapperComponent from "./src/WrapperComponent"
3+
import Sibling from "./src/Sibling"
4+
5+
AppRegistry.setWrapperComponentProvider(() => WrapperComponent);
6+
7+
export default Sibling;

package.json

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"main": "index.js",
66
"scripts": {
77
"test": "jest",
8-
"cm":"git-cz"
8+
"cm": "git-cz"
99
},
1010
"repository": {
1111
"type": "git",
@@ -19,7 +19,15 @@
1919
"homepage": "https://github.com/react-native-pure/sibling#readme",
2020
"devDependencies": {
2121
"commitizen": "^3.0.7",
22-
"cz-conventional-changelog": "^2.1.0"
22+
"cz-conventional-changelog": "^2.1.0",
23+
"fbemitter": "^2.1.1",
24+
"react": "16.0.0-alpha.12",
25+
"react-native": "^0.47"
26+
},
27+
"peerDependencies": {
28+
"fbemitter": "^2",
29+
"react-native": ">= 0.47.0",
30+
"react": ">= 16.0.0"
2331
},
2432
"config": {
2533
"commitizen": {

src/Sibling.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import * as React from "react"
2+
import SiblingEmitter, {SiblingEvents} from "./SiblingEmitter";
3+
4+
class Sibling {
5+
constructor() {
6+
this.id = 0;
7+
}
8+
9+
append(element: React.Element) {
10+
const id = this.id;
11+
SiblingEmitter.emit(SiblingEvents.append, {
12+
id: id,
13+
node: React.cloneElement(element, {
14+
key: `sibling-${id}`
15+
})
16+
});
17+
this.id++;
18+
return function () {
19+
SiblingEmitter.emit(SiblingEvents.remove, id);
20+
};
21+
}
22+
}
23+
24+
export default new Sibling();

src/SiblingEmitter.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import {EventEmitter} from "fbemitter"
2+
3+
export const SiblingEvents = {
4+
append: "append",
5+
remove: "remove"
6+
};
7+
8+
export default new EventEmitter();

src/Siblings.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import * as React from "react"
2+
import SiblingEmitter, {SiblingEvents} from "./SiblingEmitter";
3+
import type {NodeItem} from "./Types";
4+
5+
type State = {
6+
elements: {
7+
[key: number]: React.Element
8+
}
9+
};
10+
11+
export default class Siblings extends React.PureComponent<void, State> {
12+
13+
_listeners = [];
14+
15+
state = {
16+
elements: {}
17+
};
18+
19+
render() {
20+
const keys = Object.keys(this.state.elements);
21+
if (keys.length > 0) {
22+
return keys.map((key) => this.state.elements[key]);
23+
}
24+
return null;
25+
}
26+
27+
componentDidMount() {
28+
this._listeners.push(
29+
SiblingEmitter.addListener(SiblingEvents.append, (item: NodeItem) => {
30+
this.setState(({elements}) => {
31+
return {
32+
elements: {
33+
...elements,
34+
[item.id]: item.node
35+
}
36+
}
37+
});
38+
})
39+
);
40+
this._listeners.push(
41+
SiblingEmitter.addListener(SiblingEvents.remove, (id: number) => {
42+
this.setState(({elements}) => {
43+
delete elements[id];
44+
return {elements};
45+
})
46+
})
47+
)
48+
}
49+
50+
componentWillUnmount() {
51+
this._listeners.forEach(listener => listener.remove());
52+
}
53+
}

src/Types.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import * as React from "react";
2+
3+
export type NodeItem = {
4+
id: number,
5+
node: React.Node
6+
};

src/WrapperComponent.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import * as React from "react";
2+
import {View, StyleSheet} from "react-native"
3+
import Siblings from "./Siblings";
4+
5+
const styles = StyleSheet.create({
6+
container: {
7+
flex: 1
8+
}
9+
})
10+
11+
function WrapperComponent(props) {
12+
return (
13+
<View style={styles.container}>
14+
{props.children}
15+
<Siblings/>
16+
</View>
17+
);
18+
}
19+
20+
export default React.memo(WrapperComponent);

0 commit comments

Comments
 (0)