search

Home  >  Q&A  >  body text

How to get variables from component to put on App.js

Even after searching on the Internet I couldn't find it, or I didn't understand it. My question: I want to find the "inputVal" variable in the "InputField.js" component which has "!!HERE!!" in the "App.js" component (while getting) Please help me Thank you for reading my message!

export default function InputField() {
  
  function handleSubmit(e) {
    // Prevent the browser from reloading the page
    e.preventDefault();

    // Read the form data
    const form = e.target;
    const inputVal = form.myInput.value;

    console.log(inputVal);
  }

  return (
    <form method="post" onSubmit={handleSubmit}>
      <input name="myInput" id="adress-field" placeholder="Enter adress" autoComplete="on" />
      <button type="submit" id="adress-button">Send</button>
    </form>
  );
}
import './App.css';
import AccountNumber from "./components/AccountNumber";
import InputField from "./components/InputField";
import { useEffect, useState } from "react"

function App() {

  //token fetch
  const [tockens, setTockens] = useState([])
  const [loading, setLoading] = useState(false)
  useEffect(() => {
    setLoading(true)
    fetch("https://api.multiversx.com/accounts/!!HERE!!/tokens")
      .then(response => response.json())
      .then(json => setTockens(json))
      .finally(() => {
        setLoading(false)
      })
      console.log(tockens); 
  }, [])


  function round(nr, ten) { // arondi un chiffre.
    return Math.round(nr * ten) / ten;
}

function numberWithSpaces(nr) { // formate un chiffre(x xxx xxx).
    return nr.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ");
}



  return (
    <content className="content">
        <div className="up-side">
            <div className="account-number-box">
                <p id="p-account-number">Total number of accounts</p>
                <p id="account-number"><AccountNumber/></p>
            </div>
            <div className="adress-search">
                {InputField()}
            </div>
            <p>{window.inputVal}</p>
        </div>
        <div className="down-side">
            <table className="Token-section-output">
            

              {loading ? (
                <div>Loading...</div>
              ) : (
                <>
                  <h1>Tockens</h1>
                  <table className='Token-section-output' border={0}>
                    <tr className='token-row-type'>
                      <th className='token-column'>Name</th>
                      <th className='center-column'>Price</th>
                      <th>Hold</th>
                    </tr>
                    <tr className="space20"/>

                    
                    {tockens.map(tocken => (
                      <tr className='token-row' key={tocken.id}>
                        <td className='token-column'>
                        <img className="img-Tockens" src = {tocken?.assets?.pngUrl ?? "img/Question.png"} /> 
                          <p>{tocken.name}</p> 
                        </td>

                        <td className='center-column'> <p>${round(tocken.price, 10000000)}</p> </td>

                        <td> 
                          <p>{round(tocken.balance / Math.pow(10, tocken.decimals), 10000000)}</p> 
                          <p className='token-hold'>${round(tocken.valueUsd, 10000000)}</p>
                        </td>
                      </tr>
                    ))}

                  </table>
                </>
              )}


            </table>
        </div>   
    </content>
  );
}

export default App;

My reaction was not good, I searched on the internet

P粉250422045P粉250422045468 days ago475

reply all(1)I'll reply

  • P粉668019339

    P粉6680193392023-09-15 12:28:59

    You want to extend your InputField component to accept a callback function that can be passed by your app:

    export default function InputField({onSubmit}) {
      
      function handleSubmit(e) {
        // Prevent the browser from reloading the page
        e.preventDefault();
    
        // Read the form data
        const form = e.target;
        const inputVal = form.myInput.value;
    
        console.log(inputVal);
        onSubmit(inputVal)
      }
    
      ...
    }

    In your application, you need to pass this callback to your component:

    <div className="adress-search">
      <InputField onSubmit={handleSearchSubmit} />
    </div>

    Note: Components will not be consumed by calling like functions.

    In your application logic you need another state to hold your search value:

    ...
    const [searchValue, setSearchValue] = useState(null);
    
    const handleSearchSubmit = (val) => {
      setSearchValue(val);
    }
    
    useEffect(() => {
        setLoading(true)
        fetch(`https://api.multiversx.com/accounts/${searchValue}/tokens`)
          .then(response => response.json())
          .then(json => setTockens(json))
          .finally(() => {
            setLoading(false)
          });
        console.log(tockens); 
    }, [searchValue])
    ...

    reply
    0
  • Cancelreply