#javascript #reactjs #amazon-web-services #google-cloud-platform #web-development-server
#javascript #reactjs #amazon-веб-сервисы #google-облачная платформа #веб-разработка-сервер
Вопрос:
Здравствуйте, я новичок в ReactJS, и мне нужно реализовать react-intl-tel-input
для получения номера телефона со всего мира, но во время интеграции я столкнулся с некоторыми проблемами. Когда я пишу этот код:
<IntlTelInput
containerClassName="intl-tel-input"
inputClassName="form-control"
name="mobile"
placeholder="Enter Your Number"
input
type="tel"
value={this.state.phoneNumber}
onChange={this.handleChange}
Я не смог получить доступ this.handleChange
, но когда я пишу свой обычный код следующим образом
<input
type="tel"
id="phone"
name="mobile"
placeholder="Enter Your Number"
required
onChange={this.handleChange}
/>
Я смог получить доступ this.handleChange
, и мой код работал отлично, но я не смог использовать код страны. Если кто-нибудь знает решение, пожалуйста, помогите. Я получал эту ошибку
TypeError: Cannot read properties of null (reading 'phoneNumber')
Это мой полный код.
Login.js
import React from 'react'
import firebase from './firebase'
import 'firebase/auth';
import "./App.css";
import { getDatabase, ref, child, get } from "firebase/database";
import IntlTelInput from 'react-intl-tel-input';
import 'react-intl-tel-input/dist/main.css';
class Login extends React.Component {
handleChange = (e) => {
console.log (e)
const { name, value } = e.target
this.setState({
[name]: value
})
console.log (value)
this.setState({ phoneNumber: value }, () => {
console.log(this.state.phoneNumber);
});
}
configureCaptcha = () =>{
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('sign-in-button', {
'size': 'invisible',
'callback': (response) => {
// reCAPTCHA solved, allow signInWithPhoneNumber.
this.onSignInSubmit();
console.log("Recaptca varified")
},
// defaultCountry: "IN"
}
);
}
onSignInSubmit = (e) => {
e.preventDefault()
this.configureCaptcha()
const phoneNumber = this.state.mobile
console.log(phoneNumber)
const appVerifier = window.recaptchaVerifier;
const dbRef = ref(getDatabase());
get(child(dbRef, `Users/${phoneNumber}`)).then((snapshot) => {
if (snapshot.exists()) {
firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier)
.then((confirmationResult) => {
window.confirmationResult = confirmationResu<
alert('An OTP has been sent to your registered mobile number')
localStorage.setItem("Phone_No", phoneNumber)
console.log(localStorage.getItem('Phone_No'));
}).catch((error) => {
console.error(error);
alert("Oops! Some error occured. Please try again.")
});
}
else {
alert('Sorry, this mobile number is not registered with us. Please use your registered mobile number.');
}
})
}
onSubmitOTP = (e) => {
e.preventDefault()
const code = this.state.otp
console.log(code)
window.confirmationResult.confirm(code).then((result) => {
// User signed in successfully.
const Users = result.user;
console.log(JSON.stringify(Users))
this.props.history.push("/home");
}).catch((error) => {
alert("You have entered wrong code")
});
}
render() {
return (
<div className="Main-header">
<img src="./55k-logo.png" alt="Company Logo" style={{ height: "80px", width: "200px" }} />
<br />
<div>
<h2>Login Form</h2>
<p>Limtless Water. From Unlimited Air.</p>
<form onSubmit={this.onSignInSubmit}>
<div id="sign-in-button"></div>
{/* <PhoneInput */}
<label>Mobile Number</label> <br />
{/* for="phoneNumber" */}
<IntlTelInput
containerClassName="intl-tel-input"
inputClassName="form-control"
name="mobile" placeholder="Enter Your Number"
input type="tel" value={this.state.phoneNumber}
onChange={this.handleChange}
/>
{/* <input type="tel" id="phone" name="mobile" placeholder="Enter Your Number" required onChange={this.handleChange} /> */}
<div className="buttons">
<button type="submit">Submit</button>
</div>
</form>
</div>
<div>
<form onSubmit={this.onSubmitOTP}>
<label >Code</label> <br />
{/* for="code" */}
<input type="number" name="otp" placeholder="Enter The 6 Digit OTP" required onChange={this.handleChange} />
<div className="buttons" >
<button type="submit">Submit</button>
</div>
</form>
</div>
</div>
)
}
}
export default Login;
Комментарии:
1. Если вы покопаетесь в исходном коде и посмотрите на proptypes, которые
IntlTelInput
принимает компонент, вы обнаружите, что он не используетonChange
prop, а скорее имеетonPhoneNumberChange
обработчик.2. Я пробовал это, но он показывает ту же ошибку
3. Какой из них? В своем вопросе вы упомянули более 1 проблемы / ошибки. Я просто помогал с первым доступом к
this.handleChange
обработчику. ДляphoneNumber
откуда эта ошибка? Есть ли трассировка стека, сообщающая вам, в какой строке проблема?4. Обе ошибки одинаковы, потому что я звонил
phoneNumber
изthis.handleChange
и . я не знаю, как настроить документацию intl-tel-input, у меня не работает5. Сэр, это тот же код, который выполняется в моей системе, но в codesandbox он не может отправить sms, я установил все зависимости, но он сохраняет номер в консоли, но вы можете увидеть мой код в codesandbox codesandbox.io/s/blissful-smoke-kjkdq?file=/src/App.js
Ответ №1:
Проблемы
- Нет определенного начального состояния, поэтому доступ
this.state.phoneNumber
выдает ошибку. IntlTelInput
Компонент принимаетonPhoneNumberChange
обработчик, который принимает статус проверки, текущее значение и сведения о стране в качестве аргументов вместоonChange
обработчика, принимающегоonChange
объект события.
Решение
Укажите допустимое начальное состояние для компонента. В компонентах класса React state
это просто свойство класса, его просто нужно определить.
state = {};
Создайте новый обработчик изменений специально для IntlTelInput
компонента.
handlePhoneChange = (status, phoneNumber, country) => {
this.setState({ phoneNumber });
};
Переключитесь с onChange
onPhoneNumberChange
обработчика событий на обработчик событий.
<IntlTelInput
containerClassName="intl-tel-input"
inputClassName="form-control"
name="mobile"
placeholder="Enter Your Number"
input
type="tel"
value={this.state.phoneNumber}
onPhoneNumberChange={this.handlePhoneChange}
/>
Комментарии:
1. Он показывал ту же ошибку
× TypeError: Cannot read properties of null (reading 'phoneNumber')
2. @MOHAMMADZEESHAN Добавление
state = {}
должно было решить эту проблему. Проверьте это разветвленное поле codesandbox .