【问题标题】:Render React component in axios在 axios 中渲染 React 组件
【发布时间】:2018-09-11 12:25:47
【问题描述】:

我刚刚开始学习 React,我正在尝试使用第三方服务器 API 制作一个简单的应用程序来搜索职位空缺。该应用程序由form 和一个input 组成,在submit 上,它使用axios 向服务器发送请求,获得响应并必须呈现它。

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import "bootstrap/dist/css/bootstrap.css";
import axios from 'axios';

const instance = axios.create({
  baseURL: 'https://api.hh.ru/vacancies/',
  headers: {
        'User-Agent': 'React App/1.0 (tatyana.fomina.1986@gmail.com)', 
        'HH-User-Agent': 'React App/1.0 (tatyana.fomina.1986@gmail.com)'
    }
});

const Header = () => {
    return <h1>Поиск вакансий на HH.ru</h1>
}

const Vacancies = props => {
    return <div>Some Text</div>
}

class SearchForm extends React.Component {
    constructor(props) {
        super(props)

        this.state = {
            position: ''
        }

        this.handlePositionChange = this.handlePositionChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
    }

    handlePositionChange(e) {
            this.setState({
                [e.target.name]: e.target.value
            });
        }

    handleSubmit(e) {
        e.preventDefault();

        var formButton = document.getElementById('form-button');
        formButton.disabled = true;

        var position = this.state.position;
        console.log(position);

        if ( position ) {
            instance({
                    method: 'GET',
                    url: '?text=' + position,
                    data: {
                        position: position
                    }
                })
                .then(function(response) {
                    console.log(response.data);
                    formButton.disabled = false;
            })
               .catch(function (error) {
                console.log(error);
              });
        } else {
            formButton.disabled = false;
        }
    }

    render() {
        return (
            <form className="form search-form" onSubmit = { this.handleSubmit }>
                <div className="form-row">
                    <div className="form-group col-md-8">
                        <label htmlFor="position"> Position *
                            < /label>
                                <input type="text" className="form-control" name="position" id="position" placeholder="Position" onChange={ this.handlePositionChange } value={ this.state.position } />
                    </div>

                    <div className="form-group col-md-4 d-flex flex-column justify-content-end">
                        <input id = 'form-button'
                        className = 'btn btn-primary'
                        type = 'submit'
                        placeholder = 'Send' / >
                    </div>
                </div>
            </form>
        )
    }
}

class App extends Component {
  render() {
    return (
      <div className="container">
        <div className="row">
            <div className="col-12">
                <Header />
                <SearchForm />
                <Vacancies />
            </div>
        </div>
      </div>
    );
  }
}

export default App;

我在渲染 &lt;Vacancies /&gt; 时遇到问题,是否可以在每次来自服务器的新请求和响应时动态渲染并更新数据?

【问题讨论】:

    标签: reactjs axios


    【解决方案1】:

    您想要让空缺获得更新的数据,这是您在 SearchForm 发出 API 请求后获得的数据,在这种情况下,您需要重组组件并在父级中提升操作并将数据作为道具传递到兄弟组件

    import React, { Component } from 'react';
    import logo from './logo.svg';
    import './App.css';
    import "bootstrap/dist/css/bootstrap.css";
    import axios from 'axios';
    
    const instance = axios.create({
      baseURL: 'https://api.hh.ru/vacancies/',
      headers: {
            'User-Agent': 'React App/1.0 (tatyana.fomina.1986@gmail.com)', 
            'HH-User-Agent': 'React App/1.0 (tatyana.fomina.1986@gmail.com)'
        }
    });
    
    const Header = () => {
        return <h1>Поиск вакансий на HH.ru</h1>
    }
    
    const Vacancies = props => {
        return <div>Some Text</div>
    }
    
    class SearchForm extends React.Component {
        constructor(props) {
            super(props)
    
            this.state = {
                position: ''
            }
    
            this.handlePositionChange = this.handlePositionChange.bind(this);
            this.handleSubmit = this.handleSubmit.bind(this);
        }
    
        handlePositionChange(e) {
                this.setState({
                    [e.target.name]: e.target.value
                });
            }
    
        render() {
            return (
                <form className="form search-form" onSubmit = { (e) => this.handleSubmit(e, this.state.position) }>
                    <div className="form-row">
                        <div className="form-group col-md-8">
                            <label htmlFor="position"> Position *
                                < /label>
                                    <input type="text" className="form-control" name="position" id="position" placeholder="Position" onChange={ this.handlePositionChange } value={ this.state.position } />
                        </div>
    
                        <div className="form-group col-md-4 d-flex flex-column justify-content-end">
                            <input id = 'form-button'
                            className = 'btn btn-primary'
                            type = 'submit'
                            disabled={this.props.disableSubmit}
                            placeholder = 'Send' / >
                        </div>
                    </div>
                </form>
            )
        }
    }
    
    class App extends Component {
          state = {
            disableSubmit: false;
          }
          handleSubmit = (e, position) => {
            e.preventDefault();
    
            this.setState({disableSubmit : true});
            console.log(position);
    
            if ( position ) {
                instance({
                        method: 'GET',
                        url: '?text=' + position,
                        data: {
                            position: position
                        }
                    })
                    .then(function(response) {
                        this.setState({data: response.data, disableSubmit:false});
                })
                   .catch(function (error) {
                    console.log(error);
                  });
            } else {
                this.setState({disableSubmit : false});
            }
        }
      render() {
        return (
          <div className="container">
            <div className="row">
                <div className="col-12">
                    <Header />
                    <SearchForm handleSubmit = {this.handleSubmit} disableSubmit={this.state.disableSubmit}/>
                    <Vacancies data={this.state.data}/>
                </div>
            </div>
          </div>
        );
      }
    }
    
    export default App;
    

    此外,在使用 React 时,您必须确保自己没有修改 DOM 元素并以 React 方式处理所有交互。例如,您可以使用道具或状态来控制提交按钮的禁用状态。

    【讨论】:

    • 对我来说很难理解,为什么组件不能包含它自己的所有逻辑以及为什么逻辑必须放在组件的父级中。我曾经使用 OOP 类,其中包含所有数据和逻辑。但无论如何感谢您的解释!
    • @Heidel,我认为 React 文档是了解如何处理不同场景的好地方,首先您可以查看 reactjs.org/docs/lifting-state-up.html。还要检查这个答案stackoverflow.com/questions/46594900/…
    猜你喜欢
    • 2020-03-25
    • 2021-06-07
    • 2020-11-04
    • 2019-10-07
    • 1970-01-01
    • 2022-08-22
    • 2017-11-01
    • 2020-12-12
    • 2018-10-01
    相关资源
    最近更新 更多