Javascript React.js&;[…](扩展)语法
根据第页中的示例: 我们有以下项目:Javascript React.js&;[…](扩展)语法,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,根据第页中的示例: 我们有以下项目: const Todo = ({ onClick, completed, text }) => ( <li onClick={onClick} style={{ textDecoration: completed ? 'line-through' : 'none' }} > {text} </li> ) Todo.propTypes = { onClick: PropT
const Todo = ({ onClick, completed, text }) => (
<li
onClick={onClick}
style={{
textDecoration: completed ? 'line-through' : 'none'
}}
>
{text}
</li>
)
Todo.propTypes = {
onClick: PropTypes.func.isRequired,
completed: PropTypes.bool.isRequired,
text: PropTypes.string.isRequired
}
const Todo=({onClick,completed,text})=>(
{text}
)
Todo.propTypes={
onClick:PropTypes.func.isRequired,
已完成:PropTypes.bool.isRequired,
text:PropTypes.string.isRequired
}
此外,我们还有:
const TodoList = ({ todos, onTodoClick }) => (
<ul>
{todos.map((todo, index) => (
<Todo key={index} {...todo} onClick={() => onTodoClick(index)} />
))}
</ul>
)
consttodolist=({todos,onTodoClick})=>(
{todo.map((todo,index)=>(
onTodoClick(索引)}/>
))}
)
有人能告诉我上面代码的{…todo}是什么吗
我知道。。。运算符是一种扩展语法,用作[…todo,newTodoItem](将新todo项连接到旧todo列表)。
但是,在上面的示例中,todo项不是数组,它似乎生成了一个对象。对我来说,{……todo}等于{todo}
另外,在组件上分配了什么类型的属性?…todo用于将道具传递给todo组件。在Todo proptypes中,您可以看到有两种变量类型的PROP。所以操作员将其传播(传递)到Todo组件的道具上…Todo用于将道具传递给Todo组件。在Todo proptypes中,您可以看到有两种变量类型的PROP。所以操作员将其传播(传递)到Todo组件的道具上。该
..
还可用于传播对象,而不仅仅是数组。比如说,
// Using rest syntax here
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x; // 1
y; // 2
z; // { a: 3, b: 4 }
// Using spread here
let n = { x, y, ...z };
n; // { x: 1, y: 2, a: 3, b: 4 }
在上述情况下,todos
是一个包含键completed
和text
的对象数组。而不是像这样手动传递道具-
const TodoList = ({ todos, onTodoClick }) => (
<ul>
{todos.map((todo, index) => (
<Todo key={index} completed={todo.completed} text={todo.text} onClick={() => onTodoClick(index)} />
))}
</ul>
)
consttodolist=({todos,onTodoClick})=>(
{todo.map((todo,index)=>(
onTodoClick(索引)}/>
))}
)
我们使用扩展语法添加键值对作为道具。你可以把它看作是句法上的糖 也可以使用
…
来传播对象,而不仅仅是阵列。比如说,
// Using rest syntax here
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x; // 1
y; // 2
z; // { a: 3, b: 4 }
// Using spread here
let n = { x, y, ...z };
n; // { x: 1, y: 2, a: 3, b: 4 }
const obj = {a: 1, b: 2, c: 3};
在上述情况下,todos
是一个包含键completed
和text
的对象数组。而不是像这样手动传递道具-
const TodoList = ({ todos, onTodoClick }) => (
<ul>
{todos.map((todo, index) => (
<Todo key={index} completed={todo.completed} text={todo.text} onClick={() => onTodoClick(index)} />
))}
</ul>
)
consttodolist=({todos,onTodoClick})=>(
{todo.map((todo,index)=>(
onTodoClick(索引)}/>
))}
)
我们使用扩展语法添加键值对作为道具。你可以把它看作是句法上的糖
const obj = {a: 1, b: 2, c: 3};
与
相同。所以您可以使用spread
操作符…
从对象或数组中取出元素
外部反应,如果const test={a:1,b:2}
,那么const x={test}//es6特性
类似于const x={test:test}
。这与constx={test:{a:1,b:2}}
其中,
在React中创建错误,因为在MyComponent
中,可用于访问传递的obj
的道具的名称是什么?。没有。因此出现了错误
function MyComponent(props) {
// What is props.? to access obj
}
所以你用一个有名字的道具
<MyComponent x={obj} />
function MyComponent(props) {
// props.x has obj
// props.x = obj
console.log(props.x);
return <div />
}
功能MyComponent(道具){
//props.x有obj
//props.x=obj
console.log(props.x);
返回
}
但是,spread操作符会自动为道具命名,并将对象键和值作为对象的值,如回答开头所示
正如您在问题中所说,const newTodos=[…todos,newItem]
使用从todos
展开的旧todo创建一个新数组,并添加一个额外的newItem
。如果您没有传播todos
,它将创建newTodos=[[todo1,todo2],newItem]
与
相同。所以您可以使用spread
操作符…
从对象或数组中取出元素
外部反应,如果const test={a:1,b:2}
,那么const x={test}//es6特性
类似于const x={test:test}
。这与constx={test:{a:1,b:2}}
其中,
在React中创建错误,因为在MyComponent
中,可用于访问传递的obj
的道具的名称是什么?。没有。因此出现了错误
function MyComponent(props) {
// What is props.? to access obj
}
所以你用一个有名字的道具
<MyComponent x={obj} />
function MyComponent(props) {
// props.x has obj
// props.x = obj
console.log(props.x);
return <div />
}
功能MyComponent(道具){
//props.x有obj
//props.x=obj
console.log(props.x);
返回
}
但是,spread操作符会自动为道具命名,并将对象键和值作为对象的值,如回答开头所示
正如您在问题中所说,
const newTodos=[…todos,newItem]
使用从todos
展开的旧todo创建一个新数组,并添加一个额外的newItem
。如果您没有扩展todos
,它将创建newTodos=[[todo1,todo2],newItem]
扩展语法不仅仅适用于数组,请参见示例。“分配了什么类型的属性”-无论对象中有什么类型,这就是重点。请参阅示例和大多数反应入门教程。扩展语法不仅仅适用于数组,请参阅示例。“分配了什么类型的属性”-无论对象中有什么类型,这就是重点。请参阅例如和大多数介绍如何反应教程。{todo}不会做同样的事情吗?不会。{todo}将todo
的值作为一个整体使用。排列在对象(或数组)内获取单个值。当您这样做时,prop
也引用了todo
引用的对象。我猜这就像将对象的所有属性分散到单个对象一样。例如,在你的例子中,…z类似于{a},{b}。对吗?@ekalyvio真的没有理由猜测——答案是告诉你的,而且有文档记录:)一个{todo}不会做同样的事情吗?不。{todo}是使用todo
的值作为一个整体。排列在对象(或数组)内获取单个值。当y