首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除了Context.Provider内部的价值支柱之外,还有其他支柱可以工作吗?

除了Context.Provider内部的价值支柱之外,还有其他支柱可以工作吗?
EN

Stack Overflow用户
提问于 2019-06-16 22:01:26
回答 1查看 1.7K关注 0票数 3

在下面这个片段中(摘自文档):

代码语言:javascript
复制
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当作NameProvider的道具的部分。

假设对这三个方面的定义如下:

代码语言:javascript
复制
NameContext = createContext()
NameProvider = NameContext.Provider
NameConsumer = NameContext.Consumer

我们是否可以通过value道具以外的道具,在Provider内。

如果是的话,你能分享一个如何做到这一点的例子吗?我似乎也无法在反应文档中找到它。

谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2019-06-16 23:09:08

从这些文档中还不是很清楚,但是NameContext.ProviderNameProvider之间有一些细微的区别。NameContext.Provider是从React.createContext返回的原始提供者,并且只接受value作为支柱。

testing-library文档中,它们不解释它,但是它们创建了一个单独的NameProvider,它封装了NameContext.Provider,并提供了一个first/last支持接口,如下所示:

代码语言:javascript
复制
const NameProvider = ({ first, last, children }) => (
  <NameContext.Provider value={{ first, last }}>
    {children}
  </NameContext.Provider>
)

这允许您创建一个具有有限接口的提供程序,如果(例如)您正在编写其他开发人员将要使用的库,并且不希望允许他们完全访问提供者的value支持,这是非常有用的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56622927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档