Last active
October 1, 2018 22:47
This file contains hidden or 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 hidden or 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
valueof a ref object, but that would be a special case. Another might be to put thee ref in the state. -
You would store
ResizeObserverin state, just as you would with other "instance variables". -
getDerivedStateFromPropsandshouldComponentUpdatecould 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
awaitexpansion. Everyadoptstatement creates new function scope.