#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