Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
137 views
in Technique[技术] by (71.8m points)

reactjs - URL is changing but component is not rendering

I am trying to display list of forms against task id. I have put link inside button tag in Fetch.js file so that as soon as the button is clicked GetForm component should be rendered conditionally. But what actuallyhappening is that URL changes but component is not rendered.I am unable to understand that where I am messing up with the code.How can I render a GetForm component on button click?

Here is the routes.js file.

import React from "react";
import CreateForm from "./Component/CreateForm";
import GetForm from "./Component/GetForm";
import Nav from "./Component/Nav";
import {Route , Switch , Redirect} from "react-router-dom";
import Fetch from "./Component/Fetch";
import './Component/App.css';
import Home from "./Component/Home";

export const Routes=()=>{

return(

    <div>
        <Nav/>
        <Switch>

            <Route exact path="/createForm" component={CreateForm}/>

            <Route exact path="/tasks" component={Fetch}/>
            {/*<Route exact path="/tasks/:tID/forms" component={GetForm data={Forms} tID= 
    {taskID}}/>*/}
            <Route exact path="/" component={Home}/>


        </Switch>

    </div>

   );
 }

Here is Fetch.js Component

import React, { useState, useCallback, useEffect } from 'react';
import {BrowserRouter as Router,Switch,Route,Link,useParams,useRouteMatch , withRouter} from "react- 
router-dom";
import './App.css';
import GetForm from "./GetForm";
import $ from 'jquery';
import Home from "./Home";
const apiURL= 'https://app.arrivy.com/api';


 export default function Fetch (){

let { path, url } = useRouteMatch();
console.log(path);
const [taskID , setTaskId] = useState(5533754916864000);

//if button true call getform class component
const [buttonClick, setbuttonClick] = useState(false)

//array of objects

const [Forms  , setForms] = useState([{}]);
const fetchData =  () => {

    console.log((taskID));
    const tid = taskID.toString();
    const Url = `https://app.arrivy.com/api/tasks/${taskID}/forms`;
    console.log(Url);

    return new Promise((resolve, reject) => {

        $.ajax({
        
            url: Url,
            async: false,
            headers:{ 'X-Auth-Key':'2071b15a-0a29','X-Auth-Token':'dSltkKwc5YRGk5Fo9c96L4','Content- 
   Type':'application/x-www-form-urlencoded' },
            type:'get',
             dataType:'json',
            success:function(result){

                console.log('Success:' + result);
                setForms(result);
                setbuttonClick(value => !value);
               /// console.log(Forms);
                //console.log(buttonClick)
               //// setTimeout(() => { console.log(Forms); console.log(buttonClick); },2e3);
            },

            error: function (error) {
                reject(error)
             },
         })
        
    })
};


const handleSubmit=(evt)=>{

    evt.preventDefault();
    console.log(Forms);

    alert (`task id: ${taskID} found`)
    
}

    return (

        <div>
        <form class="Form" onSubmit={handleSubmit}>

        <label>
            TASK ID
        </label>
        <br />
        <input type="text"value={taskID}
            placeholder={"Input task ID here"}
            onChange={e => setTaskId(e.target.value)}
            required
         />
                
        <button className="button"
         onClick={fetchData}>

            <Link to={`/tasks/${taskID}/forms`}>get form</Link>

        </button>
            {<li>{buttonClick}</li>}

        </form>


            <Switch>

                <Route path="/tasks/:taskID/forms" exact component={buttonClick?  <GetForm data= 
 {Forms} tID={taskID}/>:null}/>

            </Switch>

        </div>
    );
}

Here is GetForm Component

import React  , {useState , useEffect} from 'react';
import RenderForm from "./RenderForm";
import $ from 'jquery';
import {
BrowserRouter as Router,
Switch,
Route,
Link,
useParams,
useRouteMatch
 } from "react-router-dom";

function GetForm({ data, tID }) {

const [formDetails  , setformDetails] = useState([{}]);

const [formID, setFormID] = useState();

const [masterformID  , setMasterFormID] = useState();

//single JSON object//single label
 const [resultdata , setResultdata] = useState({});

const [buttonClick , setbuttonClick] = useState(false);

const showForm = (tID, id) => {


    setFormID(id);
    return new Promise((resolve, reject) => {


       const Url=`https://app.arrivy.com/api/tasks/${tID}/forms/${id}`;
            $.ajax({
              
                url: Url,
                async: false,
                headers:{ 'X-Auth-Key':'2071b15a-0a29','X-Auth- 
  Token':'dSltkKwc5YRGk5Fo9c96L4','Content-Type':'application/x-www-form-urlencoded' },
                type:'get',
                dataType:'json',
                success: function (result)
                {
                    console.log('Success:');
                   // console.log(result);
                    setResultdata(result);
                    console.log(resultdata);
                    setformDetails(result.content);
                    setbuttonClick(value=>!value);
        
                 },
              error: function (error) {
                reject(error)
                },
            })
              
     })

}


return (

    <div>
        
        {
           data && data.length > 0 && data.map((d) => {

              if (d.master_form_id != null) {
                  return (
                        <div key={d.id}>
                            <div className="container">

                                <button class="button"
                                onClick={() => showForm(tID, d.master_form_id)}>

                                    {/*<Link to={`tasks/${tID}/forms/${d.master_form_id}`}>{d.title} 
  </Link>*/}
                                    RENDER FORM
                                    
                                </button>
                           
                             </div>
                        </div>
                   )
              }

              else {

                  return (

                        <div key={d.id}>

                            <div className="container">

                                <button className="button"
                                 onClick={() => showForm(tID, d.id)} >

                                    {/*<Link to={`tasks/${tID}/forms/${d.id}`}>{d.title}</Link>*/}
                                    RENDER FORM

                                </button>
                           
                            </div>
                        </div>
                    
                    )
                  }
              })
            }


        {/* <Switch>

                 <Route exact path="/tasks/:taskID/forms/formID" component={buttonClick ? <RenderForm taskID={tID} formID={formID} result={resultdata} content={formDetails} /> : null}/>

            </Switch>*/}

    </div>
  );
 }

 export default GetForm;

Here is Nav component

import React from 'react';
//import './App.css';
import {Link, withRouter} from 'react-router-dom'
function Nav() {

const navStyle={

    color:'blue'

}
return (
    <nav className="main">
        <h1>To do List</h1>
        <ul className="nav-links">

            <Link style={navStyle} to="/createForm">
                <li>Create Form</li>
            </Link>
            <Link style={navStyle} to={"/tasks"}>
                <li>Get Form</li>
            </Link>
        </ul>
    </nav>
   );
  }

 export default Nav;

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
等待大神答复

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...