Функція React onClick спрацьовує при візуалізації


212

Я передаю 2 значення дочірньому компоненту:

  1. Список об'єктів для відображення
  2. функція видалення.

Я використовую onClick. Мій код виглядає приблизно так:

module.exports = React.createClass({
    render: function(){
        var taskNodes = this.props.todoTasks.map(function(todo){
            return (
                <div>
                    {todo.task}
                    <button type="submit" onClick={this.props.removeTaskFunction(todo)}>Submit</button>
                </div>
            );
        }, this);
        return (
            <div className="todo-task-list">
                {taskNodes}
            </div>
        );
    }
});

Моє запитання: чому onClickфункція запускається під час візуалізації і як зробити це не робити?

Відповіді:


528

Оскільки ви викликаєте цю функцію замість того, щоб передати функцію onClick, змініть цю лінію на цю:

<button type="submit" onClick={() => { this.props.removeTaskFunction(todo) }}>Submit</button>

=> називається функцією стрілки, яка була введена в ES6 і буде підтримуватися в React 0.13.3 або версії.


1
як це зробити в кофескрипті?
vipin8169

14
Ви також можете уникнути цих фігурних брекетів із функцією стрілки. Я вважаю, що відповідають найкращим практикам:onClick={() => this.props.removeTaskFn(todo)}
sospedra

1
Чи поясніть, будь ласка, це ще трохи? Я розумію, що люди продовжують говорити, що це не найкраща практика, але я хотів би зрозуміти, що саме тут відбувається () => Я розумію, що таке функція стрілки, але не те, що це () і чому це погано?
wuno

@wuno () - параметри вашої анонімної функції. Тут порожньо, тому що ми не переходимо жодних параметрів. Уявіть, що () - це () функції (). Тепер щодо того, чому це не найкраща практика для прив’язки у функції render (), це тому, що на кожному рендері ми переспрямовуємо функцію на компонент, що може бути дуже дорого.
jaysonder

@LongNguyen Це те, що я шукав! велике спасибі
М. Wiśnicki

31

Замість виклику функції прив'яжіть значення до функції:

this.props.removeTaskFunction.bind(this, todo)

Посилання MDN: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind


2
ІМХО та багато інших. Ви повинні віддавати перевагу функціям без громадянства над clasess або прив'язкою, оскільки вони можуть призвести до небажаних побічних ефектів. Тому, навіть будучи обома відповідями правильними, я вважаю, що одна більш прихильна, ніж інша.
sospedra

1
Безпосереднє зв'язування у візуалізації чи в іншому місці компонента не рекомендується. Прив’язка повинна відбуватися завжди в конструкторі
Хемадрі Дасарі

15

Значенням вашого onClickатрибута має бути функція, а не виклик функції.

<button type="submit" onClick={function(){removeTaskFunction(todo)}}>Submit</button>

8
Не використовуйте анонімні функції при викликах події всередині візуалізації - це спровокує ще одне візуалізація
Splynx

4

Для тих, хто не використовує функції стрілок, але щось простіше ... Я зіткнувся з цим, додаючи круглі дужки після моєї функції signOut ...

замініть це <a onClick={props.signOut()}>Log Out</a>

з цим <a onClick={props.signOut}>Log Out</a>...! 😆


Насправді це зовсім не працює для мене. Я передав функцію і ніколи не додавав дужки, і вона все ще запускається на візуалізації. Не впевнений, чи змінилося це з лютого 1919 року, але призначення функції, як у відповіді Довгого Нгуєна та Вішаля Бішта, вирішило це питання.
BitShift

4

JSX використовується з ReactJS, оскільки він дуже схожий на HTML, і він дає програмістам відчуття використання HTML, тоді як він в кінцевому підсумку перетворюється на файл JavaScript.

Запис функції for-loop та визначення функції як {this.props.removeTaskFunction (todo)} буде виконувати функції кожного разу, коли цикл спрацьовує.

Для припинення такої поведінки нам потрібно повернути функцію onClick.

Функція стрілки жиру має прихований оператор повернення разом із властивістю bind . Таким чином, він повертає функцію OnClick, оскільки Javascript також може повертати функції !!!!!

Використання -

onClick={() => { this.props.removeTaskFunction(todo) }}

що означає-

var onClick = function() {
  return this.props.removeTaskFunction(todo);
}.bind(this);

1

JSX оцінить вирази JavaScript за фігурними дужками

У цьому випадку this.props.removeTaskFunction(todo)викликається і присвоюється повернене значенняonClick

Що ви повинні надати onClick, це функція. Для цього можна зафіксувати значення в анонімній функції.

export const samepleComponent = ({todoTasks, removeTaskFunction}) => {
    const taskNodes = todoTasks.map(todo => (
                <div>
                    {todo.task}
                    <button type="submit" onClick={() => removeTaskFunction(todo)}>Submit</button>
                </div>
            );
    return (
        <div className="todo-task-list">
            {taskNodes}
        </div>
        );
    }
});

1

У мене була подібна проблема, мій код був:

function RadioInput(props) {
    return (
    <div className="form-check form-check-inline">
        <input className="form-check-input" type="radio" name="inlineRadioOptions" id={props.id} onClick={props.onClick} value={props.label}></input>
        <label className="form-check-label" htmlFor={props.id}>{props.label}</label>
    </div>
    );
  }
class ScheduleType extends React.Component
{
    renderRadioInput(id,label)
    {
        id = "inlineRadio"+id;
        return(
            <RadioInput
                id = {id}
                label = {label}
                onClick = {this.props.onClick}
            />
        );

    }

Де воно повинно бути

onClick = {() => this.props.onClick()}

у RenderRadioInput

Це вирішило для мене питання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.