Czy istnieje sposób dodawania atrybutów do komponentu React tylko wtedy, gdy spełniony jest określony warunek?
Powinienem dodać wymagane i atrybuty readOnly, aby utworzyć elementy oparte na wywołaniu Ajax po renderowaniu, ale nie widzę, jak to rozwiązać, ponieważ readOnly = „false” to nie to samo, co całkowite pominięcie atrybutu.
Poniższy przykład powinien wyjaśnić, czego chcę, ale to nie zadziała (Błąd analizy: nieoczekiwany identyfikator).
var React = require('React');
var MyOwnInput = React.createClass({
render: function () {
return (
<div>
<input type="text" onChange={this.changeValue} value={this.getValue()} name={this.props.name}/>
</div>
);
}
});
module.exports = React.createClass({
getInitialState: function () {
return {
isRequired: false
}
},
componentDidMount: function () {
this.setState({
isRequired: true
});
},
render: function () {
var isRequired = this.state.isRequired;
return (
<MyOwnInput name="test" {isRequired ? "required" : ""} />
);
}
});
javascript
reactjs
Remi Sture
źródło
źródło
aria-modal=true
, przesuwasz zmiany (do wartości false) do magazynu atrybutów aria / data , ale nic innego się nie zmienia (takie jak zawartość komponentu lub klasa lub zmienne w nim zawarte), w wyniku czego ReactJs nie zaktualizuje aria / atrasy danych w tych komponentach. Bałam się przez cały dzień, żeby to zrozumieć.Odpowiedzi:
Najwyraźniej w przypadku niektórych atrybutów React jest wystarczająco inteligentny, aby pominąć atrybut, jeśli przekazywana mu wartość nie jest prawdziwa. Na przykład:
spowoduje:
Aktualizacja: jeśli ktoś jest ciekaw, jak / dlaczego tak się dzieje, można znaleźć szczegóły w kodzie źródłowym ReactDOM, w szczególności na liniach 30 i 167 w DOMProperty.js pliku.
źródło
null
oznacza „zachowuj się, jakbym wcale tego nie określił”. W przypadku atrybutów typu boolean preferowane jest ustawienie prawda / fałsz zamiast powtarzania nazwy atrybutu / fałsz, np.<input disabled>
Kompilacja doReact.createElement('input', {disabled: true})
="required"
część. Chrome faktycznie zrenderował tylko atrybut bez wartości.readonly
nigdy się nie dodaje, ponieważ React oczekuje atrybutureadOnly
(z dużym O).alt={props.alt || null}
.false
, alenull
upewniłem się, że atrybut został faktycznie usunięty.Odpowiedź juandemarco jest zwykle poprawna, ale oto inna opcja.
Zbuduj obiekt tak, jak lubisz:
Renderuj z rozkładaniem, opcjonalnie również z innymi rekwizytami.
źródło
_extends
dodano do niego funkcję , która (w normalnych okolicznościach) pobierzeprops
skonstruowaną z „normalne atrybuty” i zastosowanieObject.assign(props, inputProps)
.Poniżej przedstawiono przykład zastosowania bootstrap „S
Button
poprzez React-Bootstrap (wersja 0.32.4)W zależności od warunku albo
{bsStyle: 'success'}
albo{}
zostanie zwrócone. Operator rozkładania rozłoży następnie właściwości zwróconego obiektu naButton
komponent. W przypadku fałszowania, ponieważ na zwróconym obiekcie nie istnieją żadne właściwości, nic nie zostanie przekazane do komponentu.Alternatywny sposób oparty na komentarzu Andy'ego Polhilla :
Jedyną niewielką różnicą, że w drugim przykładzie Element wewnętrzny
<Button/>
jestprops
obiekt zawiera kluczbsStyle
o wartościundefined
.źródło
{bsStyle: 'success'}
czy{}
wyniki z niego), to przedmiot jest rozproszonym.<Button bsStyle={ condition ? 'success': undefined } />
uważam, że składnia jest nieco łatwiejsza, przekazywanieundefined
pomija właściwość.<Button/>
„sprops
obiekt będzie mieć kluczbsStyle
z wartościundefined
.Oto alternatywa.
Lub jego wersja wbudowana
źródło
condition
jest fałszem, to spróbuje rozwinąć / iterować ponad fałszem, co nie uważam za poprawne.false
nie ma jednego. Po prostu skontaktuj się z Babel. Działa to przycondition
ocenie wartości false, ponieważ sposób, w jaki Babel implementuje operatora. Choć może to być trywialne obejście...( condition ? { disabled: true } : {} )
, staje się wtedy nieco gadatliwe. Dzięki za ten miły wkład!data-*
lubaria-*
atrybuty, ponieważ są one specjalnym przypadkiem w JSX, więcdata-my-conditional-attr={ false }
będą generować dane wyjściowedata-my-conditional-attr="false"
zamiast pomijać atrybut. facebook.github.io/react/docs/dom-elements.htmlOto jak to zrobić.
Z warunkiem :
Nadal wolę używać zwykłego sposobu przekazywania rekwizytów, ponieważ jest on bardziej czytelny (moim zdaniem) w przypadku braku warunkowych.
Bez warunku :
źródło
...(tooltip && { tooltip }),
? Działa na komponencie, ale kiedy próbuję użyć czegoś takiego w kodzie,falseyValue && {}
że zwróci false, więc prawdopodobnie rozprzestrzeniasz się na false, np...(false)
. o wiele lepiej jest użyć pełnego wyrażenia, aby spread zachowywał się dalej...(condition ? {foo: 'bar'} : {})
Możesz użyć tego samego skrótu, który służy do dodawania / usuwania (części) komponentów (
{isVisible && <SomeComponent />}
).źródło
someCondition
jest to prawda, alesomeValue
jest to fałsz (np.false
Sam0
, itp.), Czy atrybut nadal jest uwzględniany? Jest to ważne, jeśli konieczne jest jawne dołączenie wartości fałszowania, np.0
Dla atrybutu współrzędnych itp.data-*
iaria-*
, patrz mój komentarz powyżej. Jeśli podasz wartość lub rzucisz ją jako ciąg, atrybut wyświetli: np.someAttr={ `${falsyValue}` }
Może renderowaćsomeAttr="false"
Powiedzmy, że chcemy dodać niestandardową właściwość (używając aria- * lub data- *), jeśli warunek jest spełniony:
Powiedzmy, że chcemy dodać właściwość stylu, jeśli warunek jest spełniony:
źródło
Jeśli używasz ECMAScript 6, możesz po prostu pisać w ten sposób.
źródło
Powinno to działać, ponieważ stan zmieni się po wywołaniu Ajax, a komponent nadrzędny zostanie zrenderowany.
źródło
W React możesz warunkowo renderować komponenty, ale także ich atrybuty, takie jak rekwizyty, nazwa_klasy, identyfikator i inne.
W React bardzo dobrą praktyką jest używanie operatora trójskładnikowego, który może pomóc w warunkowym renderowaniu Komponentów.
Przykład pokazuje również, jak warunkowo renderować komponent i jego atrybut stylu.
Oto prosty przykład:
źródło
Biorąc pod uwagę post JSX In Depth , możesz rozwiązać swój problem w ten sposób:
źródło