Skip to content

Commit 213927e

Browse files
committed
update
1 parent 21ef305 commit 213927e

File tree

4 files changed

+65
-50
lines changed

4 files changed

+65
-50
lines changed

__tests__/react-dom/ReactFunctionComponent-test.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,21 @@ describe('ReactFunctionComponent', () => {
3939
expect(el.textContent).toBe('A')
4040
})
4141

42-
// it('should update stateless component', () => {
43-
// function Parent(props) {
44-
// return <FunctionComponent {...props} />;
45-
// }
42+
it('should update stateless component', async () => {
43+
function Parent(props) {
44+
return <FunctionComponent {...props} />
45+
}
4646

47-
// const el = document.createElement('div');
48-
// ReactDOM.createRoot(el).render(<Parent name="A" />);
49-
// expect(el.textContent).toBe('A');
47+
let el = document.createElement('div')
48+
ReactDOM.createRoot(el).render(<Parent name='A' />)
49+
await sleep(10)
50+
expect(el.textContent).toBe('A')
5051

51-
// ReactDOM.createRoot(el).render(<Parent name="B" />);
52-
// expect(el.textContent).toBe('B');
53-
// });
52+
el = document.createElement('div')
53+
ReactDOM.createRoot(el).render(<Parent name='B' />)
54+
await sleep(10)
55+
expect(el.textContent).toBe('B')
56+
})
5457

5558
it('should not throw when stateless component returns undefined', () => {
5659
function NotAComponent() {}

examples/node-demo/index.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,18 @@ async function test1() {
1515

1616
function Parent() {
1717
useEffect(() => {
18-
return () => arr.push('Unmount parent')
18+
return () => {
19+
arr.push('Unmount parent')
20+
}
1921
})
2022
return <Child />
2123
}
2224

2325
function Child() {
2426
useEffect(() => {
25-
return () => arr.push('Unmount child')
27+
return () => {
28+
arr.push('Unmount child')
29+
}
2630
})
2731
return 'Child'
2832
}
@@ -33,12 +37,11 @@ async function test1() {
3337
throw new Error('test1 failed')
3438
}
3539

36-
root.render(<div>a</div>)
40+
root.render(null)
3741
await sleep(10)
38-
console.log(root.getChildrenAsJSX())
39-
// if (root.getChildrenAsJSX() !== null) {
40-
// throw new Error('test1 failed')
41-
// }
42+
if (arr.join('') !== 'Unmount parentUnmount child') {
43+
throw new Error('test1 failed')
44+
}
4245
}
4346

4447
test1()

packages/react-dom/src/lib.rs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1+
use gloo::console::log;
2+
use js_sys::{Array, Function, Object, Reflect};
3+
use react_reconciler::fiber::FiberRootNode;
4+
use std::cell::RefCell;
5+
use std::collections::HashMap;
6+
use std::hash::{Hash, Hasher};
17
use std::rc::Rc;
2-
3-
use js_sys::{Array, Function};
48
use wasm_bindgen::prelude::*;
59
use web_sys::Node;
610

711
use react_reconciler::Reconciler;
812
use scheduler::{
9-
Priority, unstable_cancel_callback,
10-
unstable_schedule_callback as origin_unstable_schedule_callback, unstable_should_yield_to_host,
13+
unstable_cancel_callback, unstable_schedule_callback as origin_unstable_schedule_callback,
14+
unstable_should_yield_to_host, Priority,
1115
};
1216

1317
use crate::host_config::ReactDomHostConfig;
@@ -19,6 +23,8 @@ mod renderer;
1923
mod synthetic_event;
2024
mod utils;
2125

26+
// static mut CONTAINER_TO_ROOT: Option<HashMap<JsValue, Rc<RefCell<FiberRootNode>>>> = None;
27+
2228
#[wasm_bindgen(js_name = createRoot)]
2329
pub fn create_root(container: &JsValue) -> Renderer {
2430
set_panic_hook();
@@ -29,28 +35,22 @@ pub fn create_root(container: &JsValue) -> Renderer {
2935
panic!("container should be Node")
3036
}
3137
};
38+
39+
// let mut root;
40+
// unsafe {
41+
// if CONTAINER_TO_ROOT.is_none() {
42+
// CONTAINER_TO_ROOT = Some(HashMap::new());
43+
// }
44+
// };
45+
// log!(
46+
// "ptr {:?}",
47+
// Reflect::get(container, &JsValue::from_str("ptr")).unwrap()
48+
// );
49+
// unsafe {
50+
// CONTAINER_TO_ROOT.unwrap().insert(container.clone(), root);
51+
// }
52+
3253
let root = reconciler.create_container(Rc::new(node));
3354
let renderer = Renderer::new(root, reconciler, container);
3455
renderer
3556
}
36-
37-
#[wasm_bindgen(js_name = scheduleCallback, variadic)]
38-
pub fn unstable_schedule_callback(
39-
priority_level: Priority,
40-
callback: Function,
41-
delay: &JsValue,
42-
) -> u32 {
43-
let delay = delay.dyn_ref::<Array>().unwrap();
44-
let d = delay.get(0).as_f64().unwrap_or_else(|| 0.0);
45-
origin_unstable_schedule_callback(priority_level, callback, d)
46-
}
47-
48-
#[wasm_bindgen(js_name = cancelCallback)]
49-
pub fn cancel_callback(id: u32) {
50-
unstable_cancel_callback(id)
51-
}
52-
53-
#[wasm_bindgen(js_name = shouldYieldToHost)]
54-
pub fn should_yield_to_host() -> bool {
55-
unstable_should_yield_to_host()
56-
}

packages/react-reconciler/src/child_fiber.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::rc::Rc;
66
use wasm_bindgen::{JsCast, JsValue};
77
use web_sys::js_sys::{Array, Object, Reflect};
88

9-
use shared::{derive_from_js_value, log, REACT_ELEMENT_TYPE, type_of};
9+
use shared::{derive_from_js_value, log, type_of, REACT_ELEMENT_TYPE};
1010

1111
use crate::fiber::FiberNode;
1212
use crate::fiber_flags::Flags;
@@ -58,9 +58,9 @@ fn delete_remaining_children(
5858
return_fiber: Rc<RefCell<FiberNode>>,
5959
current_first_child: Option<Rc<RefCell<FiberNode>>>,
6060
should_track_effects: bool,
61-
) {
61+
) -> Option<Rc<RefCell<FiberNode>>> {
6262
if !should_track_effects {
63-
return;
63+
return None;
6464
}
6565

6666
let mut child_to_delete = current_first_child;
@@ -78,6 +78,8 @@ fn delete_remaining_children(
7878
.sibling
7979
.clone();
8080
}
81+
82+
return None;
8183
}
8284

8385
fn reconcile_single_element(
@@ -226,7 +228,9 @@ fn update_from_map(
226228
delete_child(return_fiber, before, should_track_effects);
227229
}
228230
}
229-
return if type_of(element, "null") { None } else {
231+
return if type_of(element, "null") {
232+
None
233+
} else {
230234
Some(Rc::new(RefCell::new(FiberNode::new(
231235
WorkTag::HostText,
232236
props.clone(),
@@ -245,13 +249,18 @@ fn update_from_map(
245249
&before.borrow()._type,
246250
&derive_from_js_value(&(*element).clone(), "type"),
247251
) {
248-
return Some(use_fiber(before.clone(), derive_from_js_value(element, "props")));
252+
return Some(use_fiber(
253+
before.clone(),
254+
derive_from_js_value(element, "props"),
255+
));
249256
} else {
250257
delete_child(return_fiber, before, should_track_effects);
251258
}
252259
}
253260

254-
return Some(Rc::new(RefCell::new(FiberNode::create_fiber_from_element(element))));
261+
return Some(Rc::new(RefCell::new(FiberNode::create_fiber_from_element(
262+
element,
263+
))));
255264
}
256265
// panic!("update_from_map unsupported");
257266
None
@@ -379,8 +388,8 @@ fn _reconcile_child_fibers(
379388
}
380389
}
381390
}
382-
log!("Unsupported child type when reconcile");
383-
None
391+
392+
delete_remaining_children(return_fiber, current_first_child, should_track_effects)
384393
}
385394

386395
pub fn reconcile_child_fibers(

0 commit comments

Comments
 (0)