您好,我在组件之间传递props 时遇到困难.我不能分享确切的代码,所以我做了一个简化版.我没有收到任何控制台错误,尽管登录显然是"未定义的",任何洞察力都是值得感谢的!

App.js

import React, { useState } from "react";


function App() {
  
 
  const [login, setLogin] = useState('Jpm91297');

  const changeState = () => {
    const newLogin = document.getElementById('loginData').value;
    setLogin(newLogin);
  }

  return (
    <>
      <h1>Fancy API Call!!!</h1>
      <form onSubmit={() => changeState()}>
          <input type='text' id='loginData'></input>
          <button>Submit</button>
      </form>
    </>
  );
}

export default App;

Api.Js

import React, {useEffect, useState} from "react";

const Api = ( { login } ) => {
    const [data, setData] = useState(null);
    
    
    useEffect(() => {
        fetch(`https://api.github.com/users/${login}`)
          .then((res) => res.json())
          .then(setData);
      }, []);
    
      if (data) {
        return <div>{JSON.stringify(data)}</div>
      }
    
      return <div>No data Avail</div>

}

export default Api;

Index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import Api from './api'

ReactDOM.render(
    <>
    <App />
    <Api />
    </>,
    
   
  document.getElementById('root')
);

推荐答案

  1. 您没有阻止默认表单操作的发生.这将重新加载应用程序.
  2. You should lift the login state to the common parent of 应用程序 and 应用程序编程接口 so it can be passed down as a prop. See Lifting State Up.

例子:

指数js

login状态移动到父零部件,以便可以将其作为props 传递给关心它的子零部件.

import React, { useState } from 'react';
import ReactDOM from 'react-dom';
import 应用程序 from './应用程序';
import 应用程序编程接口 from './api';

const Root = () => {
  const [login, setLogin] = useState('Jpm91297');

  return (
    <>
      <应用程序 setLogin={setLogin} />
      <应用程序编程接口 login={login} />
    </>
  );
};

ReactDOM.render(
  <Root />,
  document.getElementById('root')
);

应用程序

直接将changeState回调作为form元素的onSubmit处理程序传递,并阻止默认操作.从onSubmit事件对象访问表单字段.

function 应用程序({ setLogin }) {
  const changeState = (event) => {
    event.preventDefault();
    const newLogin = event.target.loginData.value;
    setLogin(newLogin);
  }

  return (
    <>
      <h1>Fancy API Call!!!</h1>
      <form onSubmit={changeState}>
        <input type='text' id='loginData'></input>
        <button type="submit">Submit</button>
      </form>
    </>
  );
}

应用程序编程接口

const 应用程序编程接口 = ({ login }) => {
  const [data, setData] = useState(null);
    
  useEffect(() => {
    fetch(`https://api.github.com/users/${login}`)
      .then((res) => res.json())
      .then(setData);
  }, [login]); // <-- add login dependency so fetch is made when login changes
    
  if (data) {
    return <div>{JSON.stringify(data)}</div>;
  }
    
  return <div>No data Avail</div>;
};

Edit react-passing-props-to-other-components

enter image description here

Javascript相关问答推荐

我应该如何在此Angular 16应用程序中的方法中使用@ Hostspel?

ChartJS:分组堆叠条形图渲染错误

导入图像与内联包含它们NextJS

如何按预期聚合SON数据?

为什么我达到了时间限制!?LeetCode链接列表循环(已解决,但需要解释!)

我的glb文件没有加载到我的three.js文件中

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

Vue:ref不会创建react 性属性

如何在使用fast-xml-parser构建ML时包括属性值?

通过在页面上滚动来移动滚动条

Google maps API通过API返回ZERO_RESULTS,以获得方向请求,但适用于Google maps

如何调用名称在字符串中的实例方法?

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

我怎么在JS里连续加2个骰子的和呢?

当使用';字母而不是与';var#39;一起使用时,访问窗口为什么返回未定义的?

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

如何在Node.js中排除导出的JS文件

处理TypeScrip Vue组件未初始化的react 对象

重新呈现-react -筛选数据过多

如何在Jest中模拟函数