Как переместить состояние диалога в его собственный компонент с помощью реакции и машинописного текста? - PullRequest
0 голосов
/ 26 мая 2020
• 1000 *

после нажатия этих кнопок открывается диалоговое окно, а нажатие кнопки «Скрыть» в диалоговом окне не отображает диалоговое окно для сеанса.

Я реализовал это, как показано ниже, и работает.

export function Dialog() {
  onhide = () => { dialogContext.setDialogOpen(false);}
  const dialogContext = React.useContext(DialogContext);
  return (
      <button onclick={onHide}>hide</button>
  )
}

interface ContextProps {
    setDialogOpen: (open: boolean) => void;   
}

export const DialogContext = React.createContext<ContextProps>({setDialogOpen: (open: boolean) => 
{ }});

function Main () => {
    let [showDialog, setShowDialog] = React.useState(false);
    return (
        <DialogContext.Provider
            value={{
                setDialogOpen: (open: boolean) => {
                    if (open) {
                        const sessionDialogClosed = sessionStorage.getItem('dialog');
                        if (sessionDialogClosed !== 'closed') {
                            setShowDialog(open);
                            sessionStorage.setItem('dialog', 'closed');
                        }
                    } else {
                        setShowDialog(open);
                    } 
                },
            }}
        >
        {showDialog && <Dialog DialogContext={DialogContext}/>
            <Route 
                path="/items">
                <Home />
            </Route>
            <Route
                path="/id/item_id">
                <Books/>
            </Route>
        </DialogContext.Provider>
    )     
  }


function Home() {
      const dialogContext= React.useContext(DialogContext);
      const handleClick = () {
          dialogContext.setDialogOpen(true); //get error here
      }
      return ( 
          <button onClick={handleClick}>add</button>
      )
}

function Books({DialogContext} : Props) {
      const dialogContext= React.useContext(DialogContext);
      const handleClick = () {
          dialogContext.setDialogOpen(true); 
      }
      return ( 
          <button onClick={handleClick()}>Click me</button>
      )    
}  

Теперь я хочу, чтобы состояние showDailog в компоненте Main было перемещено в его собственный компонент с помощью реакции и машинописного текста.

Я пробовал что-то с компонентом Dialog, как показано ниже,

interface DialogOpts {
    onHide: () => any;
}

interface Props extends DialogOpts {
    isOpen: boolean;
}

export function Dialog({onHide, isOpen}: Props){
    return (
        <Fragment> 
            {isOpen && 
                <button onClick={onHide}>hide</button>
            }
        </Fragment>
    );
}


interface DialogState {
    onHide: () => any;
    isOpen: boolean;
}

const initialState: DialogState = {
    onHide: noop,
    isOpen: false,
};

function DialogReducer(
    state: DialogState,
    action: //dont know what to give here
) {
//dont know what to do here
}

export const DialogProvider = ({ children }: any) => {
    const [state, dispatch] = React.useReducer(
        DialogReducer,
        initialState
    );


    function onHide() {
        state.onHide();
    }

    return (
        <DialogContext.Provider value={dispatch}>
            {children}
            <Dialog onHide={onHide} isOpen={state.isOpen} />
        </DialogContext.Provider>
    );
};


export function useDialog() {
    const dispatch = React.useContext(DialogContext);
    return function DialogFunction(opts: DialogOpts) {
    //something missing not sure what to addd
    };
}

Как видно из приведенный выше код, это всего лишь скелет того, как я хочу, чтобы код выглядел или использовался диалог .... Я хочу определить настраиваемый хук useDialog, а затем использовать его в компоненте Home and Books ...

Но я не знаю, как это сделать. может кто-нибудь помочь мне исправить это. спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...