Last active
October 1, 2018 22:47
-
-
Save trueadm/35f083d32e5af93dd8fd706dae378123 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const React = require("react"); | |
const Lifecycles = React.createLifecycleEvents({ | |
didMount({ setState }) { | |
setState({ | |
disabled: false, | |
}); | |
}, | |
didUpdate({ inputRef }) { | |
if (document.activeElement !== inputRef.value) { | |
inputRef.value.focus(); | |
} | |
} | |
}); | |
// pass in initial state | |
const State = React.createState({ | |
disabled: true, | |
text: "", | |
}); | |
function TextboxView(props) { | |
const inputRef = React.createRef(); | |
return ( | |
<State> | |
{(state, setState) => ( | |
<Lifecycles inputRef={inputRef} setState={setState}> | |
<input | |
{...props} | |
ref={inputRef} | |
disabled={state.disabled} | |
onChange={e => setState({text: e.target.value})} | |
value={state.text} | |
/> | |
</Lifecycles> | |
)} | |
</State> | |
); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const React = require("react"); | |
const Lifecycles = React.createLifecycleEvents({ | |
componentDidMount({ setState }) { | |
setState({ | |
disabled: false, | |
}); | |
}, | |
componentDidUpdate({ inputRef }) { | |
if (document.activeElement !== inputRef.value) { | |
inputRef.value.focus(); | |
} | |
} | |
}); | |
const State = React.createState({ | |
disabled: true, | |
text: "", | |
}); | |
function ListView() { | |
const inputRef = React.createRef(); | |
// "adopt" could be sugar syntax for React's callReturn functionality | |
const { state, setState } = adopt <State />; | |
return ( | |
<Lifecycles inputRef={inputRef} setState={setState}> | |
<input | |
ref={inputRef} | |
disabled={state.disabled} | |
onChange={e => setState({text: e.target.value})} | |
value={state.text} | |
/> | |
</Lifecycles> | |
) | |
} |
@lmatteis Not quite. It's what react-powerplug tries to do.
-
Tricky one. One approach might be for the update check to compare the
value
of a ref object, but that would be a special case. Another might be to put thee ref in the state. -
You would store
ResizeObserver
in state, just as you would with other "instance variables". -
getDerivedStateFromProps
andshouldComponentUpdate
could be done like:
const State = React.createState({ lastProps: null });
function MyComponent(props) {
const shouldUpdate = ({lastProps}) => shallowCheck(lastProps, props);
const deriveState = () => ({lastProps: props});
const { state, setState } = adopt <State shouldUpdate={shouldUpdate} deriveState={deriveState} />;
// ... rest of code
}
Look like code similar to reason-react ideas
I implemented a very basic POC for #2, using Reacts error bounds: https://codesandbox.io/embed/rr1838zvqm I'm guessing this will also more or less be the way in which suspense can read out fetchers (?), like Dan showed us in his talk.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@streamich It's like
await
expansion. Everyadopt
statement creates new function scope.