Примечание:
Давайте просто думать об этом по-другому и игнорировать правила, установленные HTML5 и сосредоточенные только на JSX. У JSX есть ровно два способа передачи истинного , <MyComponent prop />
и <MyComponent prop={true} />
и точно одного пути прохождения ложного <MyComponent prop={false} />
. Я согласен, что это странное различие между HTML5 и JSX, но JSX является расширением синтаксиса для JavaScript, а не HTML, поэтому он не должен соответствовать ни одному из правил HTML.
Из JSX документов :
Этот забавный синтаксис тега не является ни строкой, ни HTML.
К вашему сведению, все правила и поведение JSX перечислены в документах React JSX и включают в себя информацию о том, как по умолчанию поддерживает значение . Важное примечание : эти документы не наследуют ничего от HTML и не должны сравниваться с HTML спецификациями.
Ответы:
- Как правильно передать логический реквизит?
Передача явного true
в JSX:
Существует ровно два способа передать явное true
: передача true
и по умолчанию для свойства true :
<MyComponent prop={true} />
<MyComponent prop />
Примечание: Как указано в документации, поведение JSX по умолчанию для a prop to true
- это просто добавленная функция, которая соответствует поведению логических атрибутов HTML5 .
Передача явного false
в JSX:
Существует только один способ передать явное false
: передача false
<MyComponent prop={false} />
Примечание: Именно здесь поведение JSX отличается от поведения логических атрибутов HTML5. В JSX нет значения по умолчанию false
; это применимо только для передачи явного true
. В отличие от HTML5, если вы ничего не передаете, вы действительно передаете undefined
, и вместо этого будут использоваться ваши заданные значения по умолчанию. Это противоречит спецификации HTML5, которая говорит, что это false
. Обратитесь к ссылке CodeSandbox в ответе # 3 для этого поведения.
Передача логической переменной / выражения в JSX:
Передача переменной или выражения в реквизит:
// via variable
const foo = true;
<MyComponent prop={foo} />
const bar = false;
<MyComponent prop={bar} />
// via expression
<MyComponent prop={Math.random() > 0.5} />
Приемлемы ли оба?
Обращаясь к способу передачи явного true
против значения по умолчанию для true
, они оба приемлемы с точки зрения компиляции JSX , Однако, если вам нужна согласованность в кодовой базе для соблюдения определенного стиля, добавьте правило ESLint jsx-boolean-value
. Я лично использую стиль Airbnb JavaScript, который включает это правило. Руководство делает упор на удобочитаемость, поэтому было решено опустить явное true
.
В случае, если стиль HTML5 является рекомендуемым (или правильным) способом, как следует обращаться с динамическими c значениями?
Не использовать стиль HTML5 (по умолчанию) поддерживает true
) для значений c (переменные / выражения); используйте способ React для передачи реквизита (явное назначение значений реквизита). Смотрите выше, как пройти эти.
Кроме того, в случае, если стиль HTML5 приемлем, как насчет значений по умолчанию? В приведенном выше примере (где prop1, prop2 - соответственно false / true по умолчанию), что даст?
Вот окончательные значения для prop1
и prop2
, переданные соответственно:
MyComponent.defaultProps = {
prop1: false,
prop2: true,
}
<MyComponent prop1 />
// prop1 == true
// prop2 == true // defaulted to true
<MyComponent prop1={true} prop2={false} />
<MyComponent prop1 prop2={false} />
// prop1 == true
// prop2 == false
Вот ссылка CodeSandbox: https://codesandbox.io/s/elated-davinci-izut1?fontsize=14&hidenavigation=1&theme=dark
Примечание: Не добавляется атрибут, а затем не передается значение (например, значение prop2
в первом примере) аналогично передаче undefined
в отличие от передачи явного false
для второго примера. Таким образом, prop2
получил значение по умолчанию true
.