typescript 我怎么能改变填充属性和svg图像iimport在一个组件在Qwik

hwazgwia  于 2023-05-19  发布在  TypeScript
关注(0)|答案(2)|浏览(134)

所以我有这个组件,我想改变SVG标志的填充属性导入。但与Qwik中的React不同,使用像调用组件这样的图像是不起作用的。或者可能是因为typescript,因为fill属性抛出错误Type '{ fill: string; }' is not assignable to type 'IntrinsicAttributes'. Property 'fill' does not exist on type 'IntrinsicAttributes'.

import { component$, useContext, useStylesScoped$ } from "@builder.io/qwik";
import styles from "./navbar.css?inline";
import TeslaLogo from "../../assets/images/tesla-logo.svg";
import Navigation from "./Navigation";
import { navbarContext } from "~/context/appContext";

const Navbar = component$(() => {
  useStylesScoped$(styles);

  const store = useContext(navbarContext)

  return (
    <div class="container">
      <TeslaLogo fill='red'/>
      <div class='img'><img src={TeslaLogo} alt="tesla-logo" class="tesla-logo" /></div>
      <div class='btn'><button class="menu-btn" onClick$={() => store.openNav = true}>Menu</button></div>
      {store.openNav && <Navigation />}
    </div>
  );
});

export default Navbar;

如果我想使用的标志在differnet网页多次与differnt颜色填充将我需要有尽可能多的标志的颜色数量,我会喜欢的标志改变?

qv7cva1a

qv7cva1a1#

阅读更多https://qwik.builder.io/docs/integrations/icons/
您可能需要inline svg方法,换句话说,将svg原样粘贴为标记<svg>...etc</svg>
你也可以像我所附的文章(页面底部)一样撰写它。

import type { QwikIntrinsicElements } from '@builder.io/qwik'
 
export function OcticonAlertFill12(props: QwikIntrinsicElements['svg'], key: string) {
  return (
    <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 12 12" {...props} key={key}><path fill="#888888" d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2a1 1 0 0 0 0 2Z"></path></svg>
  )
}
export default OcticonAlertFill12

转到您导入的文件并复制源代码后,只需将其粘贴到组件中并播放。
检查Qwick建议的图像。它有很多不同的软件包准备去的图像,我相信填充支持。
不要忘记svg可以继承stroke和fill作为css的颜色属性。如果父节点有color: red,那么svg有红色的fill

91zkwejq

91zkwejq2#

更改svg颜色的一种方法是将定义颜色的属性设置为“currentColor”。通过这种方式,svg将有一个颜色分配给包含它的元素,为此,您可以创建一个渲染SVG的组件:

import { component$ } from "@builder.io/qwik";
import type { SVGProps } from "~/types/components";

export const Logo = component$<SVGProps>(({ color = "currentColor", size, width, height }) => {
  return (
    <svg
      xmlns="http://www.w3.org/2000/svg"
      /**If you do not set a color using the "color" prop, its default value will be "currentColor".*/
      fill={color}
      viewBox="0 0 24 24"
      width={size || width || "24"}
      height={size || height || "24"}
    >
      <path />
    </svg>
  );
});

然后导入徽标组件

import { Logo } from "./logo/logo.tsx";

const Navbar = component$(() => {
  useStylesScoped$(styles);

  const store = useContext(navbarContext)

  return (
    <div class="container">
      <Link href="/" class="logo">
        <Logo />
      </Link>
    </div>
  );
});

在本例中,在徽标组件中,fill属性设置为“currentColor”的svg将采用分配给父元素的颜色,在本例中是Linkwithlogo类

.logo {
  color: #008080;
}
.logo:hover {
  color: #93bebd;
}

<Link href="/" class="logo">
  <Logo />
</Link>

注意:这只在图标或徽标只有一种颜色时才起作用,
如果它是一个有几种颜色的svg:继续前面的示例,最好将svg代码直接添加到Link元素中,并将类添加到包含颜色的svg的每个部分

const Navbar = component$(() => {
  useStylesScoped$(styles);

  return (
    <div class="container">
      <Link
        href="/"
        class="logo"
      >
        <svg
          xmlns="http://www.w3.org/2000/svg"
          viewBox="0 0 24 24"
        >
          <path
            fill="#fff"
            class="path-1"
          />
          <path
            fill="#000"
            class="path-2"
          />
          <path
            fill="#00f"
            class="path-3"
          />
        </svg>
      </Link>
    </div>
  );
});

通过这种方式,您可以使用类从CSS更改颜色

.path-1 {
  fill: //New color;
}

//or when hovering on the Link
.logo:hover .path-1 {
  fill: //New color;
}

相关问题