小编Rya*_*hel的帖子

如何在React中使用bootstrap工具提示?

我的工具提示工作较早,我正在尝试将我的组件迁移到React.我还没有使用react-bootstrap,因为我不确定我是否会去,因为它仍处于大量开发阶段而不是1.0.

这是我的渲染代码的代码片段:

<span>
    <input data-toggle="tooltip" ref="test" title={this.props.tooltip}  type="radio" name="rGroup" id={"r" + this.props.name} />
    <label className="btn btn-default" htmlFor={"r" + this.props.name}></label>
</span>
Run Code Online (Sandbox Code Playgroud)

并称之为:

<MyComponent name="apple" tooltip="banana" />
Run Code Online (Sandbox Code Playgroud)

我知道你必须调用工具提示功能让它显示出来,我认为这就是我搞砸的地方.我正在尝试这样的事情:

componentDidMount() {
    $(this.refs.test).tooltip();
    // this.refs.test.tooltip(); ?
    // $('[data-toggle="tooltip"]').tooltip(); ?
}
Run Code Online (Sandbox Code Playgroud)

但这似乎都没有奏效.工具提示未显示.

javascript tooltip twitter-bootstrap reactjs

7
推荐指数
3
解决办法
1万
查看次数

可以在不进行恒定重排的情况下动态调整高度的文本区域吗?

注意:据我所知,这不是重复项,因为使用contentEditablediv似乎不是一个很好的选择。它有很多问题(没有占位符文本,需要使用dangerouslySetInnerHTML技巧来更新文本,选择光标过于挑剔,其他浏览器问题,等等),我想使用文本区域。

我目前正在为我的React textarea组件执行以下操作:

componentDidUpdate() {
  let target = this.textBoxRef.current;

  target.style.height = 'inherit';
  target.style.height = `${target.scrollHeight + 1}px`; 
}
Run Code Online (Sandbox Code Playgroud)

这可以工作,并且允许文本区域在添加和删除换行符时动态地增加和缩小高度。

问题在于,每一次文本更改都会发生重排。这在应用程序中造成很多滞后。如果我在文本区域中按住一个键,则在附加字符时会有延迟和滞后。

如果我取消target.style.height = 'inherit';生产线,那么滞后就会消失,所以我知道这是由于这种不断回流造成的。

我听说设置overflow-y: hidden可能会消除持续的重排,但是在我看来并不是这样。同样,设置target.style.height = 'auto';不允许动态调整大小。

我目前已经开发了一种可行解决方案,但我不喜欢它,因为每次文本更改时它都是O(n)操作。我只计算换行的数量并相应地设置大小,如下所示:

// In a React Component

handleMessageChange = e => { 
  let breakCount = e.target.value.split("\n").length - 1;

  this.setState({ breakCount: breakCount });
}

render() {
  let style = { height: (41 + (this.state.breakCount * 21)) + "px" };

  return …
Run Code Online (Sandbox Code Playgroud)

html javascript css reflow reactjs

7
推荐指数
1
解决办法
366
查看次数

如何使用相同的重复事件重构两个类?

这两个类都包含另一个引发事件的私有类.然后,这两个类将这些事件重新提升给客户端.

不幸的是,这两个类中的每一个都有完全相同的代码:

public class FirstClass
{
    public delegate void FooEventHandler(string foo);
    public delegate void BarEventHandler(string bar);
    public delegate void BazEventHandler(string baz);

    public event FooEventHandler Foo;
    public event BarEventHandler Bar;
    public event BazEventHandler Baz;

    private PrivateObject privateObject;

    public FirstClass()
    {
        privateObject.Foo += FirstClass_Foo;
        privateObject.Bar += FirstClass_Bar;
        privateObject.Baz += FirstClass_Baz;
    }

    private void FirstClass_Foo(string foo)
    {
        if (Foo != null)
        {
            Foo(foo);
        }
    }

    private void FirstClass_Bar(string bar)
    {
        if (Bar != null)
        {
            Bar(bar);
        }
    }

    private void FirstClass_Baz(string baz)
    { …
Run Code Online (Sandbox Code Playgroud)

c# events inheritance

6
推荐指数
1
解决办法
451
查看次数

我应该使用EventArgs还是简单的数据类型?

我正在创建一个有趣和实践的库,我想知道,在举办活动时,如何选择传递自己的EventArgs衍生物或仅仅是数据类型.

例如,在我的库中我有这样的东西:

public delegate void LostConnectionEventHandler(string address);
public delegate void MessageReceieved(byte[] bytes);
Run Code Online (Sandbox Code Playgroud)

这是什么标准做法?我应该更换string address使用ConnectionEventArgs,并byte[] bytesMessageEventArgs

我知道其中任何一个工作得很好而且这个问题可能是主观的但我仍然对高级程序员在决定是否包含他们自己的EventArgs或仅直接传递数据时所经历的思考过程感到好奇.

谢谢!

.net c# events standards coding-style

6
推荐指数
1
解决办法
3014
查看次数

如何将操作转换为相同签名的已定义委托?

class Test
{
    public delegate void FruitDelegate(Fruit f);

    public void Notify<T>(Action<T> del) where T : Fruit
    {
        FruitDelegate f = del; // Cannot implicitly convert type 'Action<T>' to 'FruitDelegate
    }
}
Run Code Online (Sandbox Code Playgroud)

水果是一个空洞的课程.这两个代表都有相同的签名.

我似乎无法得到任何这个工作.如果我解释了我想要做的事情(提供一些背景信息),也许会有所帮助.

我想创建一个具有通用静态方法的类,该方法提供类型和方法回调(如上例所示).

我遇到的问题是委托包含一个参数,我不想在方法回调中强制转换它.例如,我想要这个:

public void SomeMethod()
{
    Test.Notify<Apple>(AppleHandler);
}

private void AppleHandler(Apple apple)
{

}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

public void SomeMethod()
{
    Test.Notify<Apple>(AppleHandler);
}

private void AppleHandler(Fruit fruit)
{
    Apple apple = (Apple)fruit;
}
Run Code Online (Sandbox Code Playgroud)

这种事可能吗?一直在努力工作几个小时没有太多运气= /

c# generics delegates

6
推荐指数
1
解决办法
4238
查看次数

为什么我有时需要使用 CSS 硬件加速来防止文本闪烁?

这将很难提出,因为尽管我尽了最大的努力,但我终其一生都无法生成一个独立的示例,因此我将不得不希望有人已经熟悉这个问题。此外,这个问题似乎不会出现在系统字体上,但会出现在像 Inter.

我在我的网站上使用Inter 字体。它看起来很棒,但有一个问题,有时文本呈现得比它应该的更粗(有时在悬停事件期间它也会暂时闪烁更粗)。最终我发现我可以通过backface-visibility: hidden在受此问题影响的元素上应用该属性来解决此问题。

它影响哪些元素似乎是随机的。绝大多数网站都运行良好,但偶尔我会发现一个有此问题的标签,我必须backface-visibility: hidden在其上添加一个属性来修复它。此外,这不会发生在所有浏览器和操作系统上。从我所见,Mac 设备上不存在此问题。在 Windows 上,它有时会在悬停在元素上时出现,等等。

好吧,那么为什么不将此 CSS 规则应用于根文档,以便它应用于每个元素呢?表现。

显然这条规则强制某种形式的 GPU 加速?我对细节不是很清楚,但是当我在全球范围内应用它时,我网站上的 FPS下降了。但是,仍然存在的问题是,如果该元素足够多,它所在的少数剩余标签可能会导致 FPS 性能问题。

所以我的问题是:是什么导致了这种情况,是否有高性能修复?我不能简单地应用于backface-visibility: hidden每个元素,因为它会破坏我网站的性能,但即使将它应用于弹出的少数随机元素也会导致性能问题。是什么导致某些元素随机具有这种奇怪的粗体文本效果?

我发现这篇文章似乎参考了闪烁和使用backface-visiblity hidden及其相应的性能问题,但目前还没有解决方案。

编辑:在进行额外的研究后,似乎不仅仅是backface-visibility: hidden修复它,而是引发硬件加速的任何 CSS 属性。因此,放入transform: translateZ(0);元素也可以修复它,但存在性能问题。仍然需要知道的是,为什么这种图形闪烁会发生在像 Inter 这样的字体而不是系统字体上,而且只发生在某些操作系统和浏览器上。此外,似乎有一些与悬停事件的交互导致绝对定位的元素变得可见,从而导致页面上的后续元素闪烁。

html css fonts rendering google-chrome

6
推荐指数
1
解决办法
242
查看次数

与正方形碰撞后如何保持圆周速度?

我正在开发一个游戏,其中玩家是一个圆圈,瓷砖是正方形。用户用键盘移动头像(圆圈),不能与瓷砖(方块)发生碰撞。

另外,我希望圆圈在碰到角落时沿着正方形滑动,这样如果玩家继续按下键向同一方向移动,他们将沿着正方形滑动而不是卡在上面。

我已经开发了我在这里面临的问题的完整再现:

let canvas = document.querySelector("canvas");
let ctx = canvas.getContext("2d");

class Vec2 {
  constructor(x, y) {
    this.x = x || 0;
    this.y = y || 0;
  }

  distance(v) {
    let x = v.x - this.x;
    let y = v.y - this.y;

    return Math.sqrt(x * x + y * y);
  }

  magnitude() { 
    return Math.sqrt(this.x * this.x + this.y * this.y);
  }

  dot(v) { 
    return this.x * v.x + this.y * v.y;
  }

  normalize() {
    let magnitude = this.magnitude();
    
    return …
Run Code Online (Sandbox Code Playgroud)

javascript algorithm math collision-detection game-physics

6
推荐指数
1
解决办法
89
查看次数

如何在 2d Canvas 和 WebGL 画布之间共享纹理?

我正在使用 WebGL 开发一个浏览器游戏,推荐的建议似乎是使用直接的 HTML 元素或在 WebGL 画布之上分层的 2d 画布来执行 UI / HUD。

这一切都很好,但是如何处理纹理共享呢?例如,游戏中可能会有掉落在地面上的物品,因此这些物品存在于世界中,因此必须是 WebGL 纹理,因为它们是存在于地面上的物品。

然而,当你拿起它们时,它们的图标就会出现在 HUD 中,因为它们会出现在屏幕底部的能力栏上。因此,您必须Canvas2D在 UI 上绘制一种纹理,WebGLTexture在 WebGL 画布上绘制一种纹理。

目前,我通过加载纹理两次来处理这个问题,一次作为游戏中的 WebGL 纹理,一次作为画布纹理。但我不认为这个解决方案具有很好的可扩展性,因为在最坏的情况下,我必须加载游戏中的每个纹理两次,并且这会使游戏的内存使用量增加一倍。

作为参考,以下是我加载纹理的两种方法:

// Load canvas texture
static createCanvasFromImage(filename: string) {
  return new Promise((resolve, reject) => {
    const canvas = document.createElement("canvas");
    const context = canvas.getContext("2d");

    let newImg = new Image();

    newImg.onload = function() {
      canvas.width = newImg.width;
      canvas.height = newImg.height;

      context.drawImage(newImg, 0, 0);

      resolve(canvas);
    }

    newImg.src = filename;
  });
}
Run Code Online (Sandbox Code Playgroud)

。 …

html javascript textures canvas webgl

6
推荐指数
1
解决办法
460
查看次数

如何在不进行昂贵的预计算的情况下以恒定速度沿着贝塞尔曲线移动?

请原谅我的长代码示例,但我无法弄清楚如何用更少的代码正确解释我的问题:

let c = document.querySelector("canvas");
let ctx = c.getContext("2d");

class BezierCurve {
  constructor(x1, y1, cpX, cpY, x2, y2) {
    this.f = 0;

    this.x1 = x1;
    this.y1 = y1;
    this.cpX = cpX;
    this.cpY = cpY;
    this.x2 = x2;
    this.y2 = y2;
    this.pointCache = this.calcPoints();
  }

  calcX(t) { return (1 - t) * (1 - t) * this.x1 + 2 * (1 - t) * t * this.cpX + t * t * this.x2; }
  calcY(t) { return (1 - t) * …
Run Code Online (Sandbox Code Playgroud)

javascript algorithm bezier spline

6
推荐指数
1
解决办法
1125
查看次数

在开发与生产版本中自动更改 Vite 代理位置?

在我正在开发的单页应用程序中,我使用 Vite,在我的vite.config.ts文件中我有以下代理:

proxy: {
  '/v1': {
    target: 'https://127.0.0.1:8080',
    changeOrigin: true,
    secure: false
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法根据是否在生产环境中来改变这个目标?就像是:

proxy: {
  '/v1': {
    target: isDev ? 'https://127.0.0.1:8080' : 'https://api.example.com',
    changeOrigin: isDev,
    secure: !isDev
  }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,在我的本地环境中,我想针对本地服务器进行开发,这样我的 fetch API 调用就会fetch("/v1/get-posts")被转发到https://127.0.0.1:8080/v1/get-posts,但在我的生产构建(我通过vite build)中创建,它们将被转发到:https://api.example.com/v1/get-posts

这可以做到吗?如果可以,如何做到?

http-proxy typescript devops vite

6
推荐指数
1
解决办法
1万
查看次数