Skip to content

Commit

Permalink
feat: support useState
Browse files Browse the repository at this point in the history
  • Loading branch information
saitoChen committed Nov 14, 2023
1 parent 02d5ac3 commit a8295ec
Show file tree
Hide file tree
Showing 15 changed files with 1,782 additions and 15 deletions.
699 changes: 699 additions & 0 deletions dist/node_modules/react-dom/client.js

Large diffs are not rendered by default.

699 changes: 699 additions & 0 deletions dist/node_modules/react-dom/index.js

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions dist/node_modules/react-dom/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

81 changes: 81 additions & 0 deletions dist/node_modules/react/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

90 changes: 90 additions & 0 deletions dist/node_modules/react/jsx-dev-runtime.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

90 changes: 90 additions & 0 deletions dist/node_modules/react/jsx-runtime.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions dist/node_modules/react/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/react-dom/src/root.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export const createRoot = (container: Container) => {

return {
render(element: ReactElementType) {
updateContainer(element, root)
return updateContainer(element, root)
}
}
}
69 changes: 66 additions & 3 deletions packages/react-reconciler/src/childFiber.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,59 @@
* @Date: 2023-11-05 13:47:45
* @Description:
*/
import { ReactElementType } from 'shared/ReactTypes'
import { FiberNode, createFiberFromElement } from './fiber'
import { ReactElementType, Props } from 'shared/ReactTypes'
import {
FiberNode,
createFiberFromElement,
createWorkInProgress
} from './fiber'
import { REACT_ELEMENT_TYPE } from 'shared/ReactSymbols'
import { HostText } from './workTags'
import { Placement } from './fiberFlags'
import { ChildDeletion, Placement } from './fiberFlags'
// import ReactDOM from 'react-dom'

const ChildReconciler = (shouldTrackEffects: boolean) => {
const deleteChild = (returnFiber: FiberNode, childToDelete: FiberNode) => {
if (!shouldTrackEffects) return
const deletions = returnFiber.deletions
if (deletions === null) {
returnFiber.deletions = [childToDelete]
returnFiber.flags |= ChildDeletion
} else {
deletions.push(childToDelete)
}
}
const reconcileSingleElement = (
returnFiber: FiberNode,
currentFiber: FiberNode | null,
element: ReactElementType
) => {
const key = element.key
work: if (currentFiber !== null) {
// update
if (currentFiber.key === key) {
if (element.$$typeof === REACT_ELEMENT_TYPE) {
if (currentFiber.type === element.type) {
// equal
// change to the wip
const existing = useFiber(currentFiber, element.props)
existing.return = returnFiber
return existing
}
deleteChild(returnFiber, currentFiber)
break work
} else {
if (__DEV__) {
console.warn('unknown react type', element)
break work
}
}
} else {
// delete
deleteChild(returnFiber, currentFiber)
}
}

const fiber = createFiberFromElement(element)

fiber.return = returnFiber
Expand All @@ -27,6 +68,17 @@ const ChildReconciler = (shouldTrackEffects: boolean) => {
currentFiber: FiberNode | null,
content: string | number
) => {
if (currentFiber !== null) {
// update
if (currentFiber.tag === HostText) {
const existing = useFiber(currentFiber, { content })
existing.return = returnFiber
return existing
}
// <div></div> -> abc
deleteChild(returnFiber, currentFiber)
}

const fiber = new FiberNode(HostText, { content }, null)
fiber.return = returnFiber

Expand Down Expand Up @@ -65,12 +117,23 @@ const ChildReconciler = (shouldTrackEffects: boolean) => {
)
}

if (currentFiber !== null) {
deleteChild(returnFiber, currentFiber)
}

if (__DEV__) {
console.warn('unknown reconcile type')
}
return null
}
}

const useFiber = (fiber: FiberNode, pendingProps: Props): FiberNode => {
const clone = createWorkInProgress(fiber, pendingProps)
clone.index = 0
clone.sibling = null
return clone
}

export const reconcileChildFibers = ChildReconciler(true)
export const mountChildFibers = ChildReconciler(false)
Loading

0 comments on commit a8295ec

Please sign in to comment.