我是Nextjs(React)的新手。我创建了两个组件header.tsx和product.tsx。我在一个文件(组件)stepperLine.tsx中调用它们。我实际上想在标题中显示产品的价格。tsx组件当我点击“选择”的产品,我尝试了很多次,但我不能这样做。与ChatGPT相同。我希望你能帮助我。
下面我们来进一步了解一下我的担忧。
我的组件Header.tsx
:这是我想在单击时显示产品价格的位置。
import { useRouter } from 'next/router';
import { Stepper } from 'react-form-stepper';
import { IoArrowBack } from 'react-icons/io5'
const Header = () => {
const router = useRouter()
return (
<>
<div className="fixed w-full bg-white top-0">
<div className="flex items-center justify-between shadow-lg px-4 shadow-black-100">
<div>
<button type="button"
onClick={() => router.push('/')}
className='text-sm flex items-center font-semibold bg-transparent py-1.5 px-3 lg:px-7.5 navbutton rounded-full hover:bg-navyblue hover:text-white'>
<IoArrowBack className='mr-2'/>
Back to home
</button>
</div>
<div className="flex-auto w-64">
<Stepper
steps={[{}, {}, {}]}
activeStep={2}
className="font-bold text-sm"
/>
</div>
<span className="font-bold text-xl border rounded-full border-black hover:border-green-500 hover:text-white cursor-pointer hover:bg-green-500 px-4">
{/* this is where i want to show the price */}
{String.fromCharCode(8355)}
</span>
</div>
</div>
</>
)
}
export default Header;
我的组件Product.tsx
:这里的价格显示得很漂亮。这只是为了测试它是否有效。但我想在标题中显示它。
import Image from 'next/image'
import { AiOutlineCheckCircle } from 'react-icons/ai'
import data from '../../data/infographie.json';
import React from "react";
const Product = () => {
const [product, setProduct] = React.useState(0);
const choiseProduct = (priceProduct: number) => {
setProduct(priceProduct)
console.log(product)
};
return (
<>
<div className="grid gridCard grid-cols-2 md:grid-cols-3 gap-4">
{
data.map((items, i) => (
<div className='rounded-lg hover:outline-none hover:skew-x-1
transition-all hover:scale-80 hover:-translate-y-1 hover:ring-2 hover:ring-green-400 shadow flex flex-col justify-between hover:bg-green-50 hover:shadow-xl'
>
<Image width={300} height={300} className="h-54 max-w-full rounded-lg" src={items.image} alt="" />
<div className='mt-2'>
<span className="font-bold text-2xl m-6">{items.name}</span>
<button type="button" onClick={()=>choiseProduct(items.prix_unitaire)} className='text-sm m-4 flex items-center justify-center font-semibold bg-transparent py-1.5 px-3 lg:px-7.5 navbutton rounded-full hover:bg-navyblue hover:text-white'>
<AiOutlineCheckCircle className='mr-2' />
Choose
</button>
</div>
</div>
))
}
</div>
{/* the price is displayed nice and beautiful here. It's just for testing to see it works.*/}
{product && (
<span className="price p-4 bg-green text-white-font-bold">Prix: {product}</span>
)}
</>
)
}
export default Product;
我的组件调用其他两个组件:StepperLine.tsx
import React from 'react'
import { useRouter } from 'next/router'
import Header './header'
import Product './categories/product'
import User './categories/user'
const StepperLine = () => {
const router = useRouter();
let contentComponent;
if (router.pathname === '/product') {
contentComponent = <Product/>;
} else if (router.pathname === '/user') {
contentComponent = <User/>;
}
return (
<>
<Header/>
{contentComponent}
</>
)
}
export default StepperLine;
“我希望能得到帮助。谢谢你。
1条答案
按热度按时间zour9fqk1#
有几种方法可以让你想到:
Redux对于像这样的小项目来说是大材小用了,但是如果你打算构建更复杂的东西,值得记住。
Context和Setter prop以类似的方式工作,将状态提升到最高父组件。我会给予你一个快速的想法如何二传手 prop 工程,让你研究其他的选择。
在StepperLine中声明一个状态变量,因为它是Product和Header的父变量:
然后修改产品组件以包含setter作为 prop 。这允许产品更新父状态:
另外修改choiseProduct以使用或新的setter prop:
回到StepperLine,将state变量链接到Product上的新prop:
现在只需将状态从StepperLine传递到Header组件。在标题中添加一个属性:
并修改StepperLine以将状态传递给Header组件:
最后,在Header组件中,您只需要显示价格
我还没有测试过这段代码,但希望这是足够的细节,让你开始。