无法从 Twin.macro 中的 Prop 获取值

Posted

技术标签:

【中文标题】无法从 Twin.macro 中的 Prop 获取值【英文标题】:Cannot Get Values from Prop in Twin.macro 【发布时间】:2021-04-18 09:08:52 【问题描述】:

你可以在这里看到我正在尝试做的一个例子:https://codesandbox.io/s/vibrant-leaf-qj8vz

注意:这个特殊的例子是使用带有样式组件的Twin.macro。在我的本地计算机上,我使用 Twin.macro 和 Emotion/next.js 尝试了相同的结果。

这是一个示例组件,说明了我正在尝试做的事情:

import React from 'react'
import tw from 'twin.macro'

const Acme = ( children, type ) => <div css=[tw`$type`]>children</div>

export default Acme

我将如何使用该组件:&lt;Acme type="text-2xl"&gt;Text Goes Here&lt;/Acme&gt;

我的期望是,我将能够通过我传递给 type 属性的 tailwind css 类来设置 &lt;Acme /&gt; 组件的这个实例的样式。相反,我收到以下错误消息:

/src/components/Acme.js: twin.macro: Property value expected type of string but got null Learn more: https://www.npmjs.com/package/twin.macro

当我试图弄清楚这一点时,我注意到一些有趣的可能相关的东西。下面是一个有效的代码变体:

const Acme = ( children, type ) => 
  const typeClass = 'text-2xl'
  const typeObj = 
    class: 'text-2xl',
  

  return <div css=[tw`$typeClass`]>children</div>


export default Acme

请注意,我创建了一个变量 typeClass 并将其设置为相同的顺风 css 类。请特别注意以下代码行:

css=[tw`$typeClass`]

我已经用变量typeClass 替换了道具type。这行得通。但是现在,我们不使用变量typeClass,而是使用我创建的对象typeObj,如下所示:

const Acme = ( children, type ) => 
  const typeClass = 'text-2xl'
  const typeObj = 
    class: 'text-2xl',
  

  return <div css=[tw`$typeObj.class`]>children</div>


export default Acme

工作并产生相同的错误:

/src/components/Acme.js: twin.macro: Property value expected type of string but got null Learn more: https://www.npmjs.com/package/twin.macro

即使typeClass === typeObj.class 的计算结果为true,情况也是如此。

我不知道这是否有帮助,但也许它可以帮助指出解决方案。如果我可以让 type 属性的行为类似于 typeClass 变量,那么希望这会起作用。

无论哪种方式,知道为什么这不起作用以及如何解决它吗?

谢谢。

【问题讨论】:

我看到你找到了解决办法,这很好!虽然我必须说那个错误 imo 它是来自 Twin.macro 的错误。这是一个有效的 javascript 语法,并且您确实传递了一个字符串作为参数。 @buzatto Twin.macro 的“所有者”解释了它为什么不起作用:Twin 是一个 babel 插件,babel 插件不会执行你编写的 javascript,它们让你遍历它并定制东西。 Babel 没有能力去搜索你在 tw 中定义的变量——它可以做非常基本的执行,但只有当它正在寻找的变量被明确定义时。这是他写的链接:github.com/ben-rogerson/twin.macro/issues/… 【参考方案1】:

我找到了答案(意味着其他人在其他网站上回答了该问题)。这里是。我必须重写组件和组件的用法如下:

// Acme.js
const Acme = ( children, type ) => <div css=[type]>children</div>

---

// App.js
import tw from "twin.macro"

<Acme type=tw`text-2xl`>Text Goes Here</Acme>

我已经尝试过了,它确实有效。

【讨论】:

以上是关于无法从 Twin.macro 中的 Prop 获取值的主要内容,如果未能解决你的问题,请参考以下文章

道具、TailwindCSS 和 Twin.Macro

如何将一个prop值从一个Class中的函数中获取?

如何将计算属性中的 vuex 数据传递给 data prop

Vue组件中的jQuery插件:无法将值传递给prop

从 vue 中的子组件控制一个 prop 类

无法从 Wikipedia API 获取数据