#javascript #reactjs
Вопрос:
Я новичок в React.js и синтаксис JavaScript, но не нашел вопроса, отвечающего на синтаксис, который меня смущает ниже, так что вот оно!
При использовании массива в React.js, почему мне нужно использовать дополнительную точечную нотацию в переданной опоре для вызова свойства в массиве?
Например, в Content
компоненте, почему я должен вводить part.parts[0].name
ниже, когда в Java/C# я мог бы просто ввести parts[0].name
? Если я не сделаю этого выше, я получу ошибку «части[0].имя не определено«.
Приведенный ниже код взят из упражнения, поэтому я намерен разобраться в странной логике и исправить ошибки в качестве упражнения по исправлению плохого кода. Это не очень красиво, но мое решение ниже работает нормально, и есть еще код, который я не включаю, и мне интересно, почему я должен использовать дополнительную точечную нотацию… любое объяснение приветствуется!
Дайте мне знать, если моя логика неверна (и структура кода ужасна, я знаю), но если я передаю массив « course.parts
непосредственно Content
компоненту, разве JavaScript не должен быть в состоянии захватить свойства name
и exercises
, когда я передаю человека part
Part
компоненту?
const App = () => {
const course = {
name: 'Half Stack application development',
parts: [
{
number: '1'
name: 'Fundamentals of React',
exercises: 10
},
{
number: '2'
name: 'Using props to pass data',
exercises: 7
},
{
number: '3'
name: 'State of a component',
exercises: 14
}
]
}
return (
<div>
<Header course={course.name} />
<Content parts={course.parts} />
<Total parts={course.parts} />
</div>
)
}
const Part = (part) => {
return (
<>
<h2>Part {part.number}: {part.name}</h2>
<h3>{part.exercises} exercises</h3>
</>
)
}
const Content = (parts) => {
console.log(parts[0])
return (
<>
<Part part={parts[0]} name={parts.parts[0].name} exercises={parts.parts[0].exercises} number={parts.parts[0].number} />
</>
)
}
Комментарии:
1. Когда вы вызываете компонент в React, вы передаете объект как «реквизит».
const Part = (part)
на самом деле это должно бытьconst Part = ({ part })
место, где вы разрушаете свойствоpart
из объекта.
Ответ №1:
Первый аргумент, передаваемый функции компонента, представляет собой объект со свойствами для каждого из реквизитов компонента. Так что, если вы позвоните:
<Content parts={x} />
… Content
функция вызывается с помощью объекта со parts
свойством на нем. Это значит, что если есть другие свойства, они могут быть переданы все вместе.
В компонентах функций react довольно часто используется деструктурирование объектов для выбора нужных реквизитов, например:
const Content = ({parts}) => {
// ^−−−−−^−−−−−−−−−−−−−−−− object destructuring
return (
<>
<Part part={parts[0]} name={parts[0].name} exercises={parts[0].exercises} number={parts[0].number} />
</>
);
};
Это функционально эквивалентно:
const Content = (props) => {
const parts = props.parts;
return (
<>
<Part part={parts[0]} name={parts[0].name} exercises={parts[0].exercises} number={parts[0].number} />
</>
);
};
Примечание: Нет необходимости использовать фрагмент, когда вы возвращаете только один элемент:
const Content = ({parts}) => {
return <Part part={parts[0]} name={parts[0].name} exercises={parts[0].exercises} number={parts[0].number} />;
};
или
const Content = ({parts}) => {
return <Part
part={parts[0]}
name={parts[0].name}
exercises={parts[0].exercises}
number={parts[0].number}
/>;
};
И если вы уже передаете часть, то, по-видимому , нет необходимости передавать name
, exercises
, и number
отдельно; Part
должны быть в состоянии получить их от объекта, который он получает в качестве своего part
свойства. Что дало бы нам:
const Content = ({parts}) => {
return <Part part={parts[0]} />;
};
Комментарии:
1. Это было очень удивительное объяснение, спасибо! Этот нижний фрагмент кода выглядит НАМНОГО чище, и это именно то, что я искал-все еще новичок в React здесь и ценю вашу проницательность!
Ответ №2:
<Content parts={course.parts} />
В основном в React эта строка означает функцию, у которой есть объект параметра, подобный function(params)
, и в этой строке это будет похоже Content({ parts: course.parts })
таким образом, ваш код const Content = (parts) => {...}
-это функция, которая принимает эти параметры.
Чтобы сделать это более понятным. вы можете переименовать parts
в скобках, чтобы быть params
или обычно props
реагировать.
как props
и объект.. вместо этого вы можете сделать что-то подобное..
const Content = ({ parts }) => {...}
что означает разрушение (способ ES6) объекта на части. затем вы можете использовать его напрямую parts[0].name
Извините за странное объяснение.
Комментарии:
1. Не странно, я следовал этой логике! Спасибо, это очень помогает. Мне, вероятно, придется более подробно ознакомиться с разрушением, но, как вы упомянули, ES6 кажется более читаемым, чем постоянное наличие «реквизита» перед всем… или, может быть, это только я! Спасибо за ответ
Ответ №3:
Все переданные данные хранятся в объекте props. Вы должны получить доступ к переданному ключу, как к деталям в вашем случае, через объект props. Вы можете использовать деструкцию, например, const Part = ({ части }) =>. Потратьте некоторое время и прочитайте документацию.
Комментарии:
1. Спасибо! В этом есть смысл. Мне нравится идея о том, чтобы меньше заниматься расшифровкой/отслеживанием для будущих инженеров, и разрушение кажется правильным выбором. Я ценю это!