我面临一个非常奇怪的问题,导致感觉像"无论你怎么样"
首先这里是代码:
renderImages = () => {
let i = 0;
const arr = [
"https://truffle-assets.imgix.net/pxqrocxwsjcc_6OcJeUMaWIYOmKgsK6IwWc_galaxy-cupcakes_squareThumbnail_en-US.jpeg",
"https://sallysbakingaddiction.com/wp-content/uploads/2017/06/moist-chocolate-cupcakes-5.jpg",
"http://is4.mzstatic.com/image/thumb/Purple127/v4/74/47/31/7447317e-9844-3ee0-d189-661a55c94abe/source/1200x630bb.jpg",
"https://i.pinimg.com/736x/55/03/94/550394c428e268868aa73e509302b84c--neopolitan-cupcakes-ice-cream-cupcakes.jpg"
];
return arr.map((item) => {
i++;
return(
<div>
<img src={item} onClick={() => alert(i)} alt={i} />
</div>
);
})
};
Run Code Online (Sandbox Code Playgroud)
现在当我点击一个图像时,它总是显示4.第一个图像显示4,最后一个图像显示4.所有这些都提醒4.但是,他们的alt标签似乎是正确的.我不认为我做错了什么但我是:)
我的反应版本是16.1.1
所以任何人都知道我在这里做错了什么?我不认为这是一个绑定问题,但谁知道.
JavaScript的作用域是函数级的,而不是块级的,创建闭包只意味着封闭的作用域被添加到封闭函数的词法环境中.
循环终止后,函数级变量i的值为4,这就是内部函数"看到"的内容.
现在即使let有一个块范围,它的范围仅限于renderImages函数而不是map,因此你仍然有一个闭包问题.
但是map为您提供了second argument一个index,您可以使用它而不是递增变量并使用它
renderImages = () => {
const arr = [
"https://truffle-assets.imgix.net/pxqrocxwsjcc_6OcJeUMaWIYOmKgsK6IwWc_galaxy-cupcakes_squareThumbnail_en-US.jpeg",
"https://sallysbakingaddiction.com/wp-content/uploads/2017/06/moist-chocolate-cupcakes-5.jpg",
"http://is4.mzstatic.com/image/thumb/Purple127/v4/74/47/31/7447317e-9844-3ee0-d189-661a55c94abe/source/1200x630bb.jpg",
"https://i.pinimg.com/736x/55/03/94/550394c428e268868aa73e509302b84c--neopolitan-cupcakes-ice-cream-cupcakes.jpg"
];
return arr.map((item, index) => {
return(
<div>
<img src={item} onClick={() => alert(index)} alt={index} />
</div>
);
})
};
Run Code Online (Sandbox Code Playgroud)
以下是如何为嵌套数组执行此操作
const arr = [[
"https://truffle-assets.imgix.net/pxqrocxwsjcc_6OcJeUMaWIYOmKgsK6IwWc_galaxy-cupcakes_squareThumbnail_en-US.jpeg",
"https://sallysbakingaddiction.com/wp-content/uploads/2017/06/moist-chocolate-cupcakes-5.jpg",
"http://is4.mzstatic.com/image/thumb/Purple127/v4/74/47/31/7447317e-9844-3ee0-d189-661a55c94abe/source/1200x630bb.jpg",
"https://i.pinimg.com/736x/55/03/94/550394c428e268868aa73e509302b84c--neopolitan-cupcakes-ice-cream-cupcakes.jpg"
],[
"https://truffle-assets.imgix.net/pxqrocxwsjcc_6OcJeUMaWIYOmKgsK6IwWc_galaxy-cupcakes_squareThumbnail_en-US.jpeg",
"https://sallysbakingaddiction.com/wp-content/uploads/2017/06/moist-chocolate-cupcakes-5.jpg",
"http://is4.mzstatic.com/image/thumb/Purple127/v4/74/47/31/7447317e-9844-3ee0-d189-661a55c94abe/source/1200x630bb.jpg",
"https://i.pinimg.com/736x/55/03/94/550394c428e268868aa73e509302b84c--neopolitan-cupcakes-ice-cream-cupcakes.jpg"
]];
const renderImages = (arr, idx) => {
return arr.map((item, index) => {
return(
<div>
<img src={item} onClick={() => alert(idx + index)} alt={idx + index} />
</div>
);
})
};
const App = () => {
let i = 0;
return (
<div>{arr.map((array, index) => {
const val = renderImages(array, i);
i += array.length;
return <div>{val}</div>
})}</div>
)
}
ReactDOM.render(<App/>, document.getElementById('app'));Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"/>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |