Skip to content

Commit e88418f

Browse files
committed
feat[ptr]: useRef 源码分析
1 parent 7d680ef commit e88418f

5 files changed

Lines changed: 89 additions & 68 deletions

File tree

Lines changed: 3 additions & 0 deletions
Loading

React/sandboxs/src/App.jsx

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,31 @@ import React,{useState} from 'react'
66
// import ForceReRender from './test/Context/ForceReRender'
77
// import FormTest from './components/Form/Test'
88
// import EventTest from './Source-Event/Test'
9-
import UseReducerText from './test/UseReducerText'
109

11-
const UseStateText = (props) => {
12-
const {initialData} = props
10+
// import UseReducerText from './test/UseReducerText'
11+
// const UseStateText = (props) => {
12+
// const {initialData} = props
1313

14-
const [state,setState] = useState(() => 666*initialData)
15-
return (
16-
<button onClick={() => setState(state*10)}>
17-
{state}
18-
</button>
19-
)
20-
}
14+
// const [state,setState] = useState(() => 666*initialData)
15+
// return (
16+
// <button onClick={() => setState(state*10)}>
17+
// {state}
18+
// </button>
19+
// )
20+
// }
21+
22+
import RefLoseControl from './test/RefLoseControl'
2123

2224
const el = (
2325
<>
2426
{/* <CheckBoxGroupText />
2527
<SelectText />
2628
<RadioBoxGroupText /> */}
2729

28-
<UseReducerText />
29-
<UseStateText initialData={1}/>
30+
{/* <UseReducerText />
31+
<UseStateText initialData={1}/> */}
32+
33+
<RefLoseControl />
3034
</>
3135
)
3236

React/sandboxs/src/index.js

Lines changed: 55 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react'; // 虽然也许可能没有使用,如果删了就会报错React.createElement
22
import ReactDOM from 'react-dom';
33

4-
import ClassCompRender from './test/ClassCompRender'
4+
// import ClassCompRender from './test/ClassCompRender'
55

66
// import './test/test1'
77
// import './test/toggleImg'
@@ -63,60 +63,60 @@ import App from './App'
6363
ReactDOM.render(<App />, document.getElementById('root'))
6464

6565

66-
const app = <div className="prop">
67-
<h1>
68-
标题
69-
{["abc", null, <p>段落</p>]}
70-
</h1>
71-
<p>
72-
{undefined}
73-
</p>
74-
<ClassCompRender />
75-
</div>;
76-
77-
function setProps(dom, props = {}) {
78-
for (const [key, value] of Object.entries(props)) {
79-
if (key === 'children' || value == null) continue;
80-
81-
if (key === 'className') {
82-
dom.setAttribute('class', value);
83-
} else if (key === 'style' && typeof value === 'object') {
84-
Object.assign(dom.style, value);
85-
} else if (/^on[A-Z]/.test(key) && typeof value === 'function') {
86-
const eventName = key.slice(2).toLowerCase();
87-
dom.addEventListener(eventName, value);
88-
} else if (key in dom) {
89-
dom[key] = value;
90-
} else {
91-
dom.setAttribute(key, String(value));
92-
}
93-
}
94-
}
95-
function render(vnode, container) {
96-
if (Array.isArray(vnode)) {
97-
vnode.forEach(child => render(child, container));
98-
return;
99-
}
100-
101-
if (vnode == null || typeof vnode === 'boolean') return;
102-
103-
if (typeof vnode === 'string' || typeof vnode === 'number') {
104-
container.appendChild(document.createTextNode(String(vnode)));
105-
return;
106-
}
107-
108-
if (typeof vnode.type === 'function') {
109-
render(vnode.type(vnode.props || {}), container);
110-
return;
111-
}
112-
113-
if (!vnode || typeof vnode !== 'object' || !vnode.type) return;
114-
115-
const dom = document.createElement(vnode.type);
116-
setProps(dom, vnode.props);
117-
render(vnode.props?.children, dom); // 直接递归,不手动包一层 list
118-
container.appendChild(dom);
119-
}
66+
// const app = <div className="prop">
67+
// <h1>
68+
// 标题
69+
// {["abc", null, <p>段落</p>]}
70+
// </h1>
71+
// <p>
72+
// {undefined}
73+
// </p>
74+
// <ClassCompRender />
75+
// </div>;
76+
77+
// function setProps(dom, props = {}) {
78+
// for (const [key, value] of Object.entries(props)) {
79+
// if (key === 'children' || value == null) continue;
80+
81+
// if (key === 'className') {
82+
// dom.setAttribute('class', value);
83+
// } else if (key === 'style' && typeof value === 'object') {
84+
// Object.assign(dom.style, value);
85+
// } else if (/^on[A-Z]/.test(key) && typeof value === 'function') {
86+
// const eventName = key.slice(2).toLowerCase();
87+
// dom.addEventListener(eventName, value);
88+
// } else if (key in dom) {
89+
// dom[key] = value;
90+
// } else {
91+
// dom.setAttribute(key, String(value));
92+
// }
93+
// }
94+
// }
95+
// function render(vnode, container) {
96+
// if (Array.isArray(vnode)) {
97+
// vnode.forEach(child => render(child, container));
98+
// return;
99+
// }
100+
101+
// if (vnode == null || typeof vnode === 'boolean') return;
102+
103+
// if (typeof vnode === 'string' || typeof vnode === 'number') {
104+
// container.appendChild(document.createTextNode(String(vnode)));
105+
// return;
106+
// }
107+
108+
// if (typeof vnode.type === 'function') {
109+
// render(vnode.type(vnode.props || {}), container);
110+
// return;
111+
// }
112+
113+
// if (!vnode || typeof vnode !== 'object' || !vnode.type) return;
114+
115+
// const dom = document.createElement(vnode.type);
116+
// setProps(dom, vnode.props);
117+
// render(vnode.props?.children, dom); // 直接递归,不手动包一层 list
118+
// container.appendChild(dom);
119+
// }
120120
// const root = document.getElementById('root');
121121
// render(app, root);
122122

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React, { useState, useRef } from 'react'
2+
3+
export default () => {
4+
const [isShow, setShow] = useState(true);
5+
const ref = useRef(null);
6+
7+
return (
8+
<div>
9+
<button onClick={() => setShow(!isShow)}>React操作DOM</button>
10+
<button onClick={() => ref.current.remove()}>开发者DOM</button>
11+
{isShow && <p ref={ref}>ceilf6</p>}
12+
</div>
13+
);
14+
}

0 commit comments

Comments
 (0)