Как получить данные ссылочного поля внутри InputComponent в Sanity.io ?

#reactjs #sanity

#reactjs #здравомыслие

Вопрос:

В Sanity Studio я пытался получить все свойства документа внутри компонента ввода. Следуйте этой статье Официально поддерживаемый способ доступа к содержимому документа Я смог использовать withDocument HOC для получения данных документа, но некоторые из них имеют тип «ссылка», поэтому я могу получить только _ref и _type вместо всего объекта. Как я могу это сделать?

Ответ №1:

Вы можете разыменовать значения с помощью оператора разыменования ->. Итак, допустим, у вас есть документ под названием book со свойством authors, которое представляет собой массив ссылочных типов.

Вы могли бы получить значения для массива authors таким образом:

 const books = await client.fetch(
`*[_type == "book"] {
   ...,
   authors[]->
 }`
)
  

Вы можете проверить документы Sanity по запросам GROQ для получения дополнительной информации.

Ответ №2:

Я разобрался с этим, используя клиент Sanity.

Импортируйте клиент в свой компонент:

 import client from 'part:@sanity/base/client';
  

Начните выполнять запрос, используя _ref в качестве _id в вашем запросе GROQ

 ...
componentDidMount = () => {
    client.fetch(`*[_type == "template" amp;amp; _id == "<put _ref value here>"]{
      title,
      body
    }`).then(response => {
      console.info('RESPONSE', response);
    })
  }
  

Ответ №3:

Итак, столкнулся с аналогичной проблемой, вот как я ее решил.

Сначала: чтобы получить весь документ: давайте вызовем document, product.

 client.fetch(`*[_type == "product"]`) 
  

Второе: для получения определенного свойства от каждого продукта
В sanity есть нечто, называемое projections, оно используется для возврата определенного свойства из object.

Допустим, каждый наш элемент в массиве объектов наших продуктов имеет свойство name, category, price и т. Д

 products=[
{
    id:""
    name:"",
    price:"",
    productCategory:"",
},
{
    id:""
    name:"",
    price:"",
    productCategory:"",
},
]
  

Таким образом, чтобы возвращать только название и цену каждого продукта из нашего запроса, мы бы написали:

 client.fetch(`*[_type == "product"]{name, price}`) 
  

где {} обозначает проекцию.

Однако наше поле ProductCategory является ссылкой на тип в нашей схеме продукта, так что:

 {
  name: "productCategory ",
  title: "productCategory ",
  type: "reference",
  to: [{ type: "category" }],
},
  

категория — это другой документ со своей собственной схемой, category.js

Третье: Запрос на выборку в первом приведенном выше примере вернул бы массив объектов product с ProductCategory в виде

 {type: "ref", ref:"random numbers"}
  

Что мы хотим сделать, так это получить название категории, на которую ссылается ref :

Итак, мы бы добавили ProductCategory в нашу проекцию

 client.fetch(`*[_type == "product"]{name, price,productCategory }`) 
  

Четвертое: Теперь мы направляем ссылку на исходный документ и получаем доступ к свойству, соответствующему этому номеру ссылки:

 client.fetch(`*[_type == "product"]{name, price,productCategory-> }`) 
  

Это вернет объект для этого документа, поскольку он находится в category.js схема:

 {
    id:"",
    name:"HeadPhones",
    type:"string",
}
  

Шестое: Чтобы получить имя, как мы можем либо сделать:

 client.fetch(`*[_type == "product"]{name, price,productCategory->{name} }`)
  

который вернет

 {
    name:"",
    price:""
    productCategory:{name:"HeadPhone"}
}
  

или сделать

 client.fetch(`*[_type == "product"]{name, price, "category": productCategory->name }`) 

{
    name:"",
    price:""    
    category:"HeadPhones"
}   
  

Мы, наконец, сопоставили ref с соответствующим документом и извлекли имя.

Источник из Sanity https://www.sanity.io/docs/how-queries-work