اذهب إلى المحتوى
  • 0

كيفية عمل redirect في react-router؟

Adam Ebrahim

السؤال

 

أنا أستخدم الإصدار الأخير من حزمة react-router ، المسمى react-router-dom. أريد معرفة كيفية إجراء إعادة التوجيه redirect بعد طلب POST. لقد كنت أقوم بعمل هذا الرمز ، ولكن بعد إتمام الطلب، لا يحدث شيء. راجعت الكود أكثر من مرة ومازلت لا أفهم سبب المشكلة.

هذا هو الكود الخاص بي:

import React, { PropTypes } from 'react';
import { Redirect } from 'react-router'
import axios from 'axios';

import AppForm from '../../components/Form';


class FormPage extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      errors: {},
      user: {
        username: '',
        email: '',
        password: '',
        confirmPassword: ''
      }
    };

    this.handleForm = this.processForm.bind(this);
    this.changeUser = this.changeUser.bind(this);
  }

  changeUser(event) {
    const target = event.target;
    const field = target.name;
    const user = this.state.user;
    user[field] = target.value;

    this.setState({
      user.field: field
    });
  }

  async handleForm(event) {
    event.preventDefault();

    const username = this.state.user.username;
    const email = this.state.user.email;
    const password = this.state.user.password;
    const confirmPassword = this.state.user.confirmPassword;
    const formData = { username, email, password, confirmPassword };

    axios.post('/register', formData, { headers: {'Accept': 'application/json'} })
      .then((response) => {
        this.setState({
          errors: {}
        });

        // السطر التالي لا يفعل شيء
        <Redirect to="/" />
      }).catch((error) => {
        const errors = error.response.data.errors ? error.response.data.errors : {};
        errors.summary = error.response.data.message;

        this.setState({
          errors
        });
      });
  }

  render() {
    return (
      <>
        <div>
          <AppForm 
            onSubmit={this.handleForm}
            onChange={this.changeUser}
            errors={this.state.errors}
            user={this.state.user}
          />
        </div>
      </>
    );
  }
}

export default FormPage;

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

لا يمكننا استخدام ال redirect في ال function كما فعلت لأنها كائن أو component وجب أن تستعمل ك component ولذلك نحتاج في هذا الموقف أن نستخدم ال hook ال useHistory  أو ال history.push بما أنك تستخدم الإصدار الأخير كالتالي

import { useHistory } from "react-router-dom"; //في الأعلى hook  يجبإستدعاء هذا ال 


async handleForm(event) {
    event.preventDefault();

    const username = this.state.user.username;
    const email = this.state.user.email;
    const password = this.state.user.password;
    const confirmPassword = this.state.user.confirmPassword;
    const formData = { username, email, password, confirmPassword };

    axios.post('/register', formData, { headers: {'Accept': 'application/json'} })
      .then((response) => {
        this.setState({
          errors: {}
        });

        // <Redirect to="/" /> بدلاً من ذلك
      
        //let history = useHistory(); history.push('/')functional component إذا كنت تستخدم 
  		
        this.props.history.push('/');
        
      }).catch((error) => {
        const errors = error.response.data.errors ? error.response.data.errors : {};
        errors.summary = error.response.data.message;

        this.setState({
          errors
        });
      });
  }

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

الأمر بسيط جدا 

دعنا نأخذ خطوة الى الوراء ونسئل ماهو ال Redirect ؟ 

بكل بساطه هو مكون موجود في ريأكت روتر من خلاله يمكنك تحويل المستخدم الى مسار أخر 

حسنا ولكي تقوم ريأكت بعرض مكون لابد من أن تقوم بعملية render ومن ضمن الأمور التي تجبر ريأكت على عملية الريندر أن يتم تغير ال state. 

جميل حتى هنا الامور بسيطه لذا فلكي تقوم ريأكت بالإستجابة إلى ما أخبرها به وتحويل المستخدم إلى مسار أخر لابد من أن تيم تحديث ال state بقيمة أريدها وعليها يتم التحويل

فيكننا بكل بساطة بإستخدام الكود التالي  

import React, { PropTypes } from 'react';
import { Redirect } from 'react-router'
import axios from 'axios';

import AppForm from '../../components/Form';


class FormPage extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      redirect: false,  // التعديل رقم 1
      errors: {},
      user: {
        username: '',
        email: '',
        password: '',
        confirmPassword: ''
      }
    };

    this.handleForm = this.processForm.bind(this);
    this.changeUser = this.changeUser.bind(this);
  }

  changeUser(event) {
    const target = event.target;
    const field = target.name;
    const user = this.state.user;
    user[field] = target.value;

    this.setState({
      user.field: field
    });
  }

  async handleForm(event) {
    event.preventDefault();

    const username = this.state.user.username;
    const email = this.state.user.email;
    const password = this.state.user.password;
    const confirmPassword = this.state.user.confirmPassword;
    const formData = { username, email, password, confirmPassword };

    axios.post('/register', formData, { headers: {'Accept': 'application/json'} })
      .then((response) => {
        this.setState({
          errors: {},
          redirect: true, // التعديل رقم 2
        });
		
      }).catch((error) => {
        const errors = error.response.data.errors ? error.response.data.errors : {};
        errors.summary = error.response.data.message;

        this.setState({
          errors
        });
      });
  }

  render() {
      if(this.state.redirect) return <Redirect to="" /> // التعديل رقم 3
    return (
      <>
        <div>
          <AppForm 
            onSubmit={this.handleForm}
            onChange={this.changeUser}
            errors={this.state.errors}
            user={this.state.user}
          />
        </div>
      </>
    );
  }
}

export default FormPage;

قمنا هنا ب ثلاثة تعديلات بسيطه

التعديل رقم 1: قمنا بإضافة خاصية جديده داخل ال state تسمى ب redirect وقيمتها ب false

التعديل رقم 2: في الكود الذي تعدل فيه قيمة ال State حدثنا أيضا قيمة ال redirect

التعديل رقم 3: بما أننا حدثنا ال state ف ريأكت سوف تقوم بالبحث داخل الداله render وترى هل نعتمد على القيم التي تم تغيرها في ال state لعرض مكون معين؟ إذا كانت الإجابه بنعم فتقوم بتنفيذ ال render مرة أخرى وبالتالي سوف يتحقق الشرط المكتول لتنفيذ عملية ال redirect ويتم عرض مكون Redirect الذي بدوره يقوم بتحويل المستخدم إلى المسار الذي تريد.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...