Материал-ui selectField значение изменения [дубликат]

new_list = list(old_list)

40
задан boom 28 September 2014 в 21:50
поделиться

6 ответов

сам компонент меняет свое состояние и не меняет своего, а реквизит для детей.

<Parent>
  <Child name={ this.state.childName } />
</Parent>

Родитель может изменить свое собственное состояние и изменить дочернее имя, но он изменит реквизиты для его детей.

edit1: для вызова событий от дочернего элемента к его родительскому элементу вы должны передать дочернему процессу такой обработчик событий:

var Child = React.createClass({
  render: function() {
    return (<button onClick={ this.props.onClick }>Hey</button>);
  }
});

var Parent = React.createClass({
  onChildClick: console.log.bind(console), // will print the event..
  render: function() {
    return (<Child onClick={ this.onChildClick } />);
  }
});

React.renderComponent(<Parent />, document.body);

в этом коде, когда вы Нажмите кнопку «Ребенок», чтобы передать событие родителям. целью передачи событий является развязка компонентов. возможно, в вашем приложении вам нужно это конкретное действие, но в другом приложении у вас будет, вы будете использовать его по-другому.

8
ответ дан Gal Schlezinger 21 August 2018 в 01:13
поделиться
  • 1
    Что делать, если компонент получает событие касания и нуждается в обновлении некоторых данных, на которые полагается родительский компонент? – boom 28 September 2014 в 22:08
  • 2
    то вы можете передать ему обработчик событий. как я добавлю в секундах раздел edit1. – Gal Schlezinger 30 September 2014 в 21:22

Вопреки приведенным здесь ответам, вы можете напрямую обновить реквизиты, если не возражаете против того, чтобы педантичный кружок рассказывал о «Реагировании». В React.js найдите следующие строки кода:

Object.freeze(element.props);
Object.freeze(element);

и закомментируйте их. Voila, изменяемые реквизиты!

-21
ответ дан joeyp 21 August 2018 в 01:13
поделиться
  • 1
    изменение реактивного ядра для реализации анти-шаблона - действительно плохая практика. – orourkedd 16 December 2015 в 00:45
  • 2
    Итак, что происходит, когда я обновляю свою версию React? Или скажите, что, если я получаю ответ от CDN? Или я работаю над тем, кто не имеет доступа к моей фантастически модифицированной версии React? Или я хочу использовать плагин / компонент / часть функций, которые кто-то создал? Вы говорите: «бросая вызов педантическому кругу», большинство остальных говорит, что «ужасная идея изменить основные функции библиотеки не имеет контроля над», – DanCouper 18 February 2016 в 14:55
  • 3
    это безумие. – Travis Webb 4 July 2016 в 18:36
  • 4
    педантичный: «чрезмерно озабоченный мельчайшими деталями или формализмами». То, что вы описываете, нарушает основное правило Реакт ... не такая мельчайшая деталь. – Andrew 20 October 2016 в 10:45
  • 5
    Это получило 19 голосов. Но я думаю, что это, безусловно, самый интересный ответ. Вопрос: как вы запускаете повторную визуализацию ui, если вы это сделаете? – Dave Ford 3 May 2017 в 23:47

Мое решение было довольно иным, но некоторые люди могли столкнуться с этим. В инструментах Chrome Dev он продолжал говорить, что мои реквизиты были только для чтения, и когда я попытался передать их еще дальше, я бы получил ошибку. Теперь причина в том, что я не вызывал метод render(). Я вместо этого вызывал свой компонент следующим образом:

const Navigation = () =>{

    return (
        <div className="left-navigation">
            <ul>
                <Link to='/dashboard'><li>Home</li></Link>
                <Link to='/create-seedz'><li>Create Seedz</li></Link>
                <Link to='/create-promotion'><li>Create Promotion</li></Link>
                <Link to='/setting'><li>Setting</li></Link>
                <SignOutButton  />
            </ul>
        </div>
    );
}

Я добавил метод рендеринга, и он решил мою проблему о возможности передачи реквизита вниз:

class Navigation extends Component{
render(){
    return (
        <div className="left-navigation">
            <ul>
                <Link to='/dashboard'><li>Home</li></Link>
                <Link to='/create-seedz'><li>Create Seedz</li></Link>
                <Link to='/create-promotion'><li>Create Promotion</li></Link>
                <Link to='/setting'><li>Setting</li></Link>
                <SignOutButton user={this.props.user} signedOut={this.props.signedOut} authed={this.props.authed}/>
            </ul>
        </div>
    );
}
}

Надеюсь, это поможет кто-то.

0
ответ дан Lewis 21 August 2018 в 01:13
поделиться

Философия Реагента заключается в том, что реквизит должен быть неизменным и сверху вниз. Это означает, что родитель может отправлять любые значения поддержки, которые ему нравятся для ребенка, но ребенок не может изменять свои собственные реквизиты. Что вы делаете, это реагировать на входящие реквизиты, а затем, если хотите, изменить состояние вашего ребенка на основе входящих реквизитов.

Таким образом, вы никогда не обновляете свои собственные реквизиты или реквизит родителя. Когда-либо. Вы только обновляете свое собственное состояние и реагируете на значения prop, которые вы даете родителям.

Если вы хотите, чтобы какое-то действие произошло над дочерним элементом, который изменяет что-то в состоянии, то то, что вы делаете, проходит обратный вызов ребенку, который он может выполнить при данном действии. Этот обратный вызов может затем изменить состояние родителя, которое по очереди может отправлять разные реквизиты ребенку при повторной визуализации.

71
ответ дан ruffin 21 August 2018 в 01:13
поделиться
  • 1
    Хорошо, это затрагивает мой главный вопрос. Что делать, если компонент получает событие касания и нуждается в обновлении некоторых данных, на которые полагается родительский компонент? Имеют ли дети ссылку на своего родителя? Что, если это не непосредственный родитель? Как вы обновляете реквизит родителя, как только у вас есть ссылка на него? благодаря – boom 28 September 2014 в 22:12
  • 2
    Так же, как вы можете передать обратный вызов onChange или похожий на дочерний элемент React builtin, подобный <input />. Вы делаете то же самое для своих собственных детей. Чтобы ребенок принял свойство onTouch (или все, что вы хотите назвать), и попросите ребенка выполнить this.props.onTouch в обработчике событий касания в дочернем элементе. Родитель должен установить onTouch={this.childTouchHandler} или что-то подобное, чтобы справиться с этим. Таким образом, родитель должен всегда иметь дело с собственным состоянием, однако он может реагировать на «обычай», события и обрабатывать обратные вызовы, которые он отправляет детям. – Mike Driver 28 September 2014 в 22:18
  • 3
    Если у компонента есть список предметов (например, продуктов) для отображения, должны ли продукты быть реквизитом или состоянием? Он должен будет получить эти элементы с сервера через ajax. Я предполагаю, что это должно быть указано, поскольку компонент не может изменить свои реквизиты, когда он получает новый набор данных с сервера. Но сделать продукцию как государство не звучит правильно. Есть предположения? – Pratheep 11 October 2015 в 18:02
  • 4
    @Pratheep, помещая данные в состояние, которое извлекается внутри самого компонента, совершенно нормально. – Mike Driver 11 October 2015 в 18:32
  • 5
    @Mike Driver Хорошее объяснение. благодаря..! – TheFlash 1 March 2017 в 08:41

Чтобы ответить на вопрос о том, почему

In React, реквизит протекает вниз, от родителя до дочернего .

Это означает, что когда мы вызываем ReactDOM.render, React может отображать корневой узел, пропускать любые реквизиты, а затем забывать об этом узле. Это сделано. Это уже сделано.

Это происходит у каждого компонента, мы его визуализируем, а затем переходим вниз по дереву с глубиной.

Если компонент может мутировать его реквизит, мы будем менять объект, который доступен для родительского узла после того, как родительский узел уже был обработан. Это может вызвать все виды странного поведения, например, user.name может иметь одно значение в одной части приложения и другое значение в другой части, и оно может обновиться при следующем запуске рендеринга.

Чтобы вывести вымышленный пример:

// App renders a user.name and a profile
const App = (props) => 
  React.createElement('div', null, [
    props.user.name,
    React.createElement(Profile, props}
  ])

// Profile changes the user.name and renders it
// Now App has the wrong DOM.
const Profile = ({user}) => {
  user.name = "Voldemort" // Uh oh!
  return React.createElement('div', null, user.name);
}

// Render the App and give it props
ReactDOM.render(
  React.createElement(App, {user: {name: "Hermione"}}), 
  document.getElementById('app'))
);

Отправляем приложение. Он выводит «Гермиону» в «Теневой ДОМ». Мы представляем профиль, он выводит «Волдеморт». Приложение теперь неправильно. Он должен сказать «Волдеморт», потому что user.name - «Волдеморт», но мы уже выводим «Гермиону», и уже слишком поздно его менять.

Значение будет различным в разных частях приложения.

Модификация реквизита была бы двусторонней привязкой

. Мутирующие реквизиты были бы формой двух -внешняя привязка. Мы будем изменять значения, на которые может положиться другой компонент, расположенный выше дерева.

Угловое 1 имело это, вы могли бы изменять любые данные в любое время, где бы вы ни были. Для работы ему понадобился циклический $ digest. В принципе, он будет перемещаться вокруг и вокруг, повторно рендерируя DOM, пока все данные не закончили распространение. Это было частью причины, по которой Угловой 1 был настолько медленным.

9
ответ дан superluminary 21 August 2018 в 01:13
поделиться

В режиме React state и props выполняют разные цели: state позволяет компоненту поддерживать некоторые изменяющиеся значения, а props - это mecanism для распространения этих значений для детей.

Детям не разрешается самостоятельно изменять ценности, которые они получают через реквизиты, только потому, что дизайнерам React легче поддерживать приложение, построенное таким образом. Их точка зрения заключается в том, что, когда только одному компоненту разрешено обновлять некоторую часть состояния, легче обнаружить, кто его изменил, и найти корень ошибок.

12
ответ дан Valéry 21 August 2018 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: