Javascript 组件在React功能组件中的状态更改后未重新呈现
我正在尝试使用另一个文件中的数组创建一个带有React useState的推荐选框类型组件,但我的组件在更改数组后不会重新渲染。每2秒应更换一次 根据我的控制台日志,我的状态正在正确更改。但组件只是没有重新渲染 我的外部数据如下所示:Javascript 组件在React功能组件中的状态更改后未重新呈现,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我正在尝试使用另一个文件中的数组创建一个带有React useState的推荐选框类型组件,但我的组件在更改数组后不会重新渲染。每2秒应更换一次 根据我的控制台日志,我的状态正在正确更改。但组件只是没有重新渲染 我的外部数据如下所示: 导出常量证明=[ { img:“”, 信息:“, 公司:“, 链接:“ }, { img:“”, 信息:“, 公司:“, 链接:“ },... 不确定它是否没有重新渲染,因为它看起来像这样?这只是一个猜测。 [对象][对象][对象] const证明=({clas
导出常量证明=[
{
img:“”,
信息:“,
公司:“,
链接:“
},
{
img:“”,
信息:“,
公司:“,
链接:“
},...
不确定它是否没有重新渲染,因为它看起来像这样?这只是一个猜测。
[对象][对象][对象]
const证明=({classes})=>{
const[arr,setArr]=使用状态(证明);
常量递增证明=(arr2)=>{
设el=arr2.shift();
arr2.推力(el);
setArr(arr2);
console.log('changed');
};
使用效果(
() => {
设置间隔(()=>{
console.log('changing');
递增证明(arr);
}, 2000);
},
[arr]
);
返回(
{arr.map((e)=>(
“{e.info}”
))}
);
};
任何帮助都将不胜感激,
谢谢。直接修改状态是一种不好的做法。相反,如果您有
arr2.length>0
,则可以获取第一个元素。然后使用.filter()
可以按索引删除第一个元素。然后使用setState()
的回调选项
请尝试以下操作:
const IncrementTestimonials = (arr2) => {
if (arr2.length > 0) {
const firstElem = arr2[0];
const filteredArray = arr2.filter((e, i) => i !== 0);
setArr(prevArr => filteredArray.concat(firstElem));
}
};
使用将有一个新阵列,请参阅文档中的:
filter()
方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素
我希望这会有帮助!直接修改状态是一种不好的做法。相反,如果您有
arr2.length>0
,则可以获取第一个元素。然后使用.filter()
可以按索引删除第一个元素。然后使用setState()
的回调选项
请尝试以下操作:
const IncrementTestimonials = (arr2) => {
if (arr2.length > 0) {
const firstElem = arr2[0];
const filteredArray = arr2.filter((e, i) => i !== 0);
setArr(prevArr => filteredArray.concat(firstElem));
}
};
使用将有一个新阵列,请参阅文档中的:
filter()
方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素
我希望这有帮助!试试这个
const IncrementTestimonials = () => {
let arr2 = [...arr]
let el = arr2.shift();
arr2.push(el);
setArr(arr2);
console.log('changed');
};
useEffect(
() => {
const timer = setTimeout(() => { // use timeout as after every 2 seconds , your effect will run
console.log('changing');
IncrementTestimonials();
}, 2000);
return ()=>{
clearTimeout(timer);
}
},
[ arr ]
);
return (
{arr.map((e) => (
<div className={classes.Card}>
<p>{`${e.info}}`</p> // use string interpolation i.e backticks
</div>
))}
);
const incrementessentials=()=>{
设arr2=[…arr]
设el=arr2.shift();
arr2.推力(el);
setArr(arr2);
console.log('changed');
};
使用效果(
() => {
const timer=setTimeout(()=>{//使用timeout,因为每隔2秒,效果就会运行
console.log('changing');
递增证明();
}, 2000);
return()=>{
清除超时(计时器);
}
},
[arr]
);
返回(
{arr.map((e)=>(
{`${e.info}}`//使用字符串插值,即倒勾
))}
);
试试这个
const IncrementTestimonials = () => {
let arr2 = [...arr]
let el = arr2.shift();
arr2.push(el);
setArr(arr2);
console.log('changed');
};
useEffect(
() => {
const timer = setTimeout(() => { // use timeout as after every 2 seconds , your effect will run
console.log('changing');
IncrementTestimonials();
}, 2000);
return ()=>{
clearTimeout(timer);
}
},
[ arr ]
);
return (
{arr.map((e) => (
<div className={classes.Card}>
<p>{`${e.info}}`</p> // use string interpolation i.e backticks
</div>
))}
);
const incrementessentials=()=>{
设arr2=[…arr]
设el=arr2.shift();
arr2.推力(el);
setArr(arr2);
console.log('changed');
};
使用效果(
() => {
const timer=setTimeout(()=>{//使用timeout,因为每隔2秒,效果就会运行
console.log('changing');
递增证明();
}, 2000);
return()=>{
清除超时(计时器);
}
},
[arr]
);
返回(
{arr.map((e)=>(
{`${e.info}}`//使用字符串插值,即倒勾
))}
);
arr2只是对您的状态的引用,您不能修改它,您可以这样做:
const IncrementTestimonials = () => {
const arr2 = [...arr];
let el = arr2.shift();
arr2.push(el);
setArr(arr2);
console.log('changed');
};
arr2只是对您的状态的引用,您不能修改它,您可以这样做:
const IncrementTestimonials = () => {
const arr2 = [...arr];
let el = arr2.shift();
arr2.push(el);
setArr(arr2);
console.log('changed');
};
试试这个:
const IncrementTestimonials = (arr2) => {
let el = arr2.shift();
arr2.push(el);
setArr(JSON.parse(JSON.stringify(arr2)));
console.log('changed ' + arr[0].company);
};
试试这个:
const IncrementTestimonials = (arr2) => {
let el = arr2.shift();
arr2.push(el);
setArr(JSON.parse(JSON.stringify(arr2)));
console.log('changed ' + arr[0].company);
};
我的初始证明数组是一个对象数组,这有关系吗?不太重要,只是想知道你是在尝试动态获取证明还是已经预填充。是的,它们都预填充在另一个文件中。刚刚更新了我的注释,此更改将强制数组更新数组。arraysMy initi有问题al-Certificational数组是一个对象数组,这有关系吗?不太重要,只是想知道您是在尝试动态获取这些证明,还是已经预填充。是的,它们都预填充在另一个文件中。刚刚更新了我的注释,此更改将强制数组更新数组。数组的变异是一个问题