class PlayerControls extends React.Component {
constructor(props) {
super(props)
this.state = {
loopActive: false,
shuffleActive: false,
}
}
render() {
var shuffleClassName = this.state.toggleActive ? "player-control-icon active" : "player-control-icon"
return (
<div className="player-controls">
<FontAwesome
className="player-control-icon"
name='refresh'
onClick={this.onToggleLoop}
spin={this.state.loopActive}
/>
<FontAwesome
className={shuffleClassName}
name='random'
onClick={this.onToggleShuffle}
/>
</div>
);
}
onToggleLoop(event) {
// "this is undefined??" <--- here
this.setState({loopActive: !this.state.loopActive})
this.props.onToggleLoop()
}
Я хочу обновить loopActive
состояние при переключении, но this
объект не определен в обработчике. Согласно учебному документу, я this
должен ссылаться на компонент. Я что-то упускаю?
javascript
reactjs
this
Maximus S
источник
источник
() => this.onToggleLoop
onClick на после перемещения функции onToggleLoop в свой класс реакции, она также будет работать.this
undefined? Я знаю, чтоthis
в Javascript зависит от того, как вызывается функция, но что здесь происходит?Есть несколько способов.
Один из них - добавить
this.onToggleLoop = this.onToggleLoop.bind(this);
в конструктор.Другой - стрелочные функции
onToggleLoop = (event) => {...}
.И еще есть
onClick={this.onToggleLoop.bind(this)}
.источник
onClick
объект, будет возвращать новую функцию при каждом рендеринге, и, таким образом, похоже, что для свойства было передано новое значение, что нарушает егоshouldComponentUpdate
вPureComponent
s.Напишите свою функцию так:
onToggleLoop = (event) => { this.setState({loopActive: !this.state.loopActive}) this.props.onToggleLoop() }
Функции жирной стрелки
источник
ReferenceError: fields are not currently supported
.Я столкнулся с похожей привязкой в функции рендеринга и в итоге передал контекст
this
следующим образом:{someList.map(function(listItem) { // your code }, this)}
Я также использовал:
{someList.map((listItem, index) => <div onClick={this.someFunction.bind(this, listItem)} /> )}
источник
Вы должны заметить, что это
this
зависит от того, как функция вызывается, например: когда функция вызывается как метод объекта, онаthis
устанавливается на объект, для которого вызывается метод.this
доступен в контексте JSX как объект вашего компонента, поэтому вы можете вызвать нужный метод встроенным в качествеthis
метода.Если вы просто передадите ссылку на функцию / метод, кажется, что реакция вызовет ее как независимую функцию.
onClick={this.onToggleLoop} // Here you just passing reference, React will invoke it as independent function and this will be undefined onClick={()=>this.onToggleLoop()} // Here you invoking your desired function as method of this, and this in that function will be set to object from that function is called ie: your component object
источник
onClick={this.onToggleLoop}
при условии, что в вашем классе компонента вы определили поле (свойство)onToggleLoop = () => /*body using 'this'*/
Если вы используете babel, вы привязываете this с помощью оператора привязки ES7 https://babeljs.io/docs/en/babel-plugin-transform-function-bind#auto-self-binding
export default class SignupPage extends React.Component { constructor(props) { super(props); } handleSubmit(e) { e.preventDefault(); const data = { email: this.refs.email.value, } } render() { const {errors} = this.props; return ( <div className="view-container registrations new"> <main> <form id="sign_up_form" onSubmit={::this.handleSubmit}> <div className="field"> <input ref="email" id="user_email" type="email" placeholder="Email" /> </div> <div className="field"> <input ref="password" id="user_password" type="new-password" placeholder="Password" /> </div> <button type="submit">Sign up</button> </form> </main> </div> ) } }
источник
Если вы вызываете созданный вами метод в методах жизненного цикла, таких как componentDidMount ..., вы можете использовать только
this.onToggleLoop = this.onToogleLoop.bind(this)
и функцию жирной стрелкиonToggleLoop = (event) => {...}
.Обычный подход к объявлению функции в конструкторе не работает, потому что методы жизненного цикла вызываются раньше.
источник
в моем случае это было решение = () => {}
methodName = (params) => { //your code here with this.something }
источник
В моем случае для компонента без состояния, который получил ссылку с помощью forwardRef, мне пришлось сделать то, что здесь сказано https://itnext.io/reusing-the-ref-from-forwardref-with-react-hooks-4ce9df693dd
Отсюда (onClick не имеет доступа к эквиваленту this)
const Com = forwardRef((props, ref) => { return <input ref={ref} onClick={() => {console.log(ref.current} } /> })
К этому (это работает)
const useCombinedRefs = (...refs) => { const targetRef = React.useRef() useEffect(() => { refs.forEach(ref => { if (!ref) return if (typeof ref === 'function') ref(targetRef.current) else ref.current = targetRef.current }) }, [refs]) return targetRef } const Com = forwardRef((props, ref) => { const innerRef = useRef() const combinedRef = useCombinedRefs(ref, innerRef) return <input ref={combinedRef } onClick={() => {console.log(combinedRef .current} } /> })
источник
Вы можете переписать способ вызова метода onToggleLoop из метода render ().
render() { var shuffleClassName = this.state.toggleActive ? "player-control-icon active" : "player-control-icon" return ( <div className="player-controls"> <FontAwesome className="player-control-icon" name='refresh' onClick={(event) => this.onToggleLoop(event)} spin={this.state.loopActive} /> </div> ); }
Документация React показывает этот шаблон при вызове функций из выражений в атрибутах.
источник