gpt4 book ai didi

reactjs - 除了 value prop 之外的任何 prop 都可以在 Context.Provider 中工作吗

转载 作者:行者123 更新时间:2023-12-05 03:00:40 26 4
gpt4 key购买 nike

在下面的这个片段中(取自 docs ):

import React from 'react'
import { render, cleanup } from '@testing-library/react'
import 'jest-dom/extend-expect'
import { NameContext, NameProvider, NameConsumer } from '../react-context'

afterEach(cleanup)

/**
* Test default values by rendering a context consumer without a
* matching provider
*/
test('NameConsumer shows default value', () => {
const { getByText } = render(<NameConsumer />)
expect(getByText(/^My Name Is:/)).toHaveTextContent('My Name Is: Unknown')
})

/**
* To test a component tree that uses a context consumer but not the provider,
* wrap the tree with a matching provider
*/
test('NameConsumer shows value from provider', () => {
const tree = (
<NameContext.Provider value="C3P0">
<NameConsumer />
</NameContext.Provider>
)
const { getByText } = render(tree)
expect(getByText(/^My Name Is:/)).toHaveTextContent('My Name Is: C3P0')
})

/**
* To test a component that provides a context value, render a matching
* consumer as the child
*/
test('NameProvider composes full name from first, last', () => {
const tree = (
<NameProvider first="Boba" last="Fett">
<NameContext.Consumer>
{value => <span>Received: {value}</span>}
</NameContext.Consumer>
</NameProvider>
)
const { getByText } = render(tree)
expect(getByText(/^Received:/).textContent).toBe('Received: Boba Fett')
})

/**
* A tree containing both a providers and consumer can be rendered normally
*/
test('NameProvider/Consumer shows name of character', () => {
const tree = (
<NameProvider first="Leia" last="Organa">
<NameConsumer />
</NameProvider>
)
const { getByText } = render(tree)
expect(getByText(/^My Name Is:/).textContent).toBe('My Name Is: Leia Organa')
})

我不明白我们将 firstlast 作为 props 传递给 NameProvider 的部分。

假设这三个的定义如下:

NameContext = createContext()
NameProvider = NameContext.Provider
NameConsumer = NameContext.Consumer

我们是否可以在 Provider 中传递 value 属性以外的属性。

如果是,能否请您分享一个如何完成的示例。我似乎也无法在 React 文档中找到它。

提前致谢!! :D

最佳答案

这些文档不是很清楚,但是 NameContext.ProviderNameProvider 之间存在细微差别。 NameContext.Provider 是从 React.createContext 返回的原始 Provider,仅将 value 作为 prop。

testing-library文档中,他们没有解释,但是他们创建了一个单独的NameProvider,它包装了NameContext.Provider,并提供了一个 first/last 属性接口(interface),如下所示:

const NameProvider = ({ first, last, children }) => (
<NameContext.Provider value={{ first, last }}>
{children}
</NameContext.Provider>
)

这允许您创建一个具有有限接口(interface)的提供者,如果(例如)您正在编写一个其他开发人员将使用的库,并且您不想让他们完全访问提供者的属性。

关于reactjs - 除了 value prop 之外的任何 prop 都可以在 Context.Provider 中工作吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56622927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com