Existe uma maneira de adicionar atributos apenas a um componente React se uma determinada condição for atendida?
Eu devo adicionar os atributos obrigatório e readOnly para formar elementos com base em uma chamada Ajax após a renderização, mas não consigo ver como resolver isso, pois readOnly = "false" não é o mesmo que omitir o atributo completamente.
O exemplo abaixo deve explicar o que eu quero, mas não funcionará (Erro de análise: identificador inesperado).
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
fonte
fonte
aria-modal=true
, você envia as alterações (para false) para o armazenamento de atributos aria / data , mas nada mais é alterado (como o conteúdo, a classe ou as variáveis do componente), pois o ReactJs não atualiza a ária / dados atraem nesses componentes. Eu estive brincando o dia inteiro para perceber isso.Respostas:
Aparentemente, para certos atributos, o React é inteligente o suficiente para omitir o atributo se o valor que você passar para ele não for verdadeiro. Por exemplo:
vai resultar em:
Atualização: se alguém estiver curioso sobre como / por que isso acontece, você pode encontrar detalhes no código-fonte do ReactDOM, especificamente nas linhas 30 e 167 do arquivo DOMProperty.js .
fonte
null
significa "agir como se eu não o tivesse especificado". Para booleano dom atributos verdadeiro / falso é preferido em relação repetindo o nome de atributo / falso, por exemplo,<input disabled>
compila aReact.createElement('input', {disabled: true})
="required"
parte. O Chrome realmente processou apenas o atributo sem o valor.readonly
nunca é adicionado porque o React está esperando o atributoreadOnly
(com O maiúsculo).alt={props.alt || null}
.false
, mas apenasnull
verifiquei se o atributo foi realmente removido.resposta de juandemarco geralmente está correta, mas aqui está outra opção.
Crie um objeto como quiser:
Renderize com spread, opcionalmente passando outros adereços também.
fonte
_extends
foi adicionada a ele, que (em circunstâncias normais) terá comoprops
base os "atributos normais" e apliqueObject.assign(props, inputProps)
.Aqui está um exemplo do uso de Bootstrap 's
Button
via Reagir-Bootstrap (versão 0.32.4):Dependendo da condição, um
{bsStyle: 'success'}
ou{}
será devolvido. O operador de propagação espalhará as propriedades do objeto retornado para oButton
componente. No caso de falsidade, como não existem propriedades no objeto retornado, nada será passado para o componente.Uma maneira alternativa baseada no comentário de Andy Polhill :
A única pequena diferença é que no segundo exemplo o componente interno
<Button/>
doprops
objecto terá uma chavebsStyle
com um valor deundefined
.fonte
{bsStyle: 'success'}
ou{}
resulta dela) e, em seguida, o objeto é espalhado.<Button bsStyle={ condition ? 'success': undefined } />
, acho a sintaxe um pouco mais fácil, a passagemundefined
omitirá a propriedade.<Button/>
, oprops
objeto do componente interno terá uma chavebsStyle
com o valor deundefined
.Aqui está uma alternativa.
Ou sua versão embutida
fonte
condition
for falso, isso tentará expandir / iterar sobre falso, o que não acho correto.false
não é um. Basta verificar com Babel. Isso funciona quando secondition
avalia falso, desde a maneira como Babel implementa o operador. Embora possa ser uma solução trivial...( condition ? { disabled: true } : {} )
, ela se torna um pouco detalhada. Obrigado por esta boa entrada!data-*
ouaria-*
atributos condicionalmente , como eles são um caso especial em JSX; portantodata-my-conditional-attr={ false }
, produzirá emdata-my-conditional-attr="false"
vez de omitir o atributo. facebook.github.io/react/docs/dom-elements.htmlAqui está uma maneira de fazer isso.
Com uma condição :
Eu ainda prefiro usar a maneira regular de transmitir adereços, porque é mais legível (na minha opinião) no caso de não ter condicionais.
Sem um condicional :
fonte
...(tooltip && { tooltip }),
? Ele funciona no componente, mas quando tento usar algo assim no código, recebo um erro, o que significa que tento espalhar um valor não-iterávelfalseyValue && {}
retornará falso, então é provável que você esteja se espalhando por falso, por exemplo...(false)
. muito melhor usar a expressão completa para que o spread continue a se comportar...(condition ? {foo: 'bar'} : {})
Você pode usar o mesmo atalho, usado para adicionar / remover (partes de) componentes (
{isVisible && <SomeComponent />}
).fonte
someCondition
for verdadeiro, massomeValue
for falso (por exemplofalse
, ele próprio0
, etc.), o atributo ainda é incluído? Isso é importante se for necessário incluir explicitamente um valor falso, por exemplo, a0
para um atributo de coordenada etc.data-*
earia-*
, veja meu comentário acima. Se você citar o valor ou convertê-lo como uma String, o atributo será exibido: por exemplo,someAttr={ `${falsyValue}` }
poderia renderizarsomeAttr="false"
Digamos que queremos adicionar uma propriedade customizada (usando aria- * ou data- *) se uma condição for verdadeira:
Digamos que queremos adicionar uma propriedade de estilo se uma condição for verdadeira:
fonte
Se você usa o ECMAScript 6, pode simplesmente escrever assim.
fonte
Isso deve funcionar, pois seu estado será alterado após a chamada do Ajax e o componente pai será renderizado novamente.
fonte
No React, você pode renderizar condicionalmente os componentes, mas também seus atributos, como props, className, id e muito mais.
No React, é uma prática muito boa usar o operador ternário que pode ajudá-lo a renderizar condicionalmente os Componentes.
Um exemplo também mostra como renderizar condicionalmente o Component e seu atributo de estilo.
Aqui está um exemplo simples:
fonte
Considerando a postagem JSX In Depth , você pode resolver seu problema desta maneira:
fonte