小编Rap*_*ael的帖子

Next.js - 客户端导航与 html 中的更改

我目前正在学习next.js 教程,但我很难理解以下内容:

教程在这里告诉我,点击某个<Link>元素不会触发服务器请求,而是进行“客户端导航”,即用js调整页面内容:

Link 组件支持在同一 Next.js 应用程序中的两个页面之间进行客户端导航。客户端导航意味着页面转换使用 JavaScript 进行

马上问三个问题:

  • 对我来说,这听起来像是没有 next.js 等的常规 SPA React 路由。但事实并非如此,对吧?
  • <Link>如果我在 Chrome 开发工具中禁用 javascript,它仍然有效。这说明js实际上并没有发生转换。这与他们的说法是否矛盾?
  • 当我右键单击该页面并单击“查看源代码”(在 Chrome 中)时,我在单击<Link>. (与“常规”反应行为相反)。这怎么能被认为是“客户端导航”呢?

在本教程中,他们进一步告诉我:

默认情况下,Next.js 预渲染每个页面。这意味着 Next.js 提前为每个页面生成 HTML,而不是由客户端 JavaScript 完成这一切

这一说法听起来与上面引用的另一说法相矛盾。你能帮我澄清一下吗?当我点击时<Link>到底发生了什么?是否加载了新的 html 文件?如果是这样,这怎么可能发生在“客户端”。谢谢你!

client-side reactjs server-side-rendering next.js

8
推荐指数
1
解决办法
4117
查看次数

在react-三纤维/drei/Three.js中使用相同的GLTF模型两次

在这个最小的反应三纤维应用程序中,我尝试加载并包含相同的 GLTF 模型两次:

import React, { Suspense } from "react";
import { Canvas } from "@react-three/fiber";
import { useGLTF } from "@react-three/drei";

function MyContent() {
  const firstGltf = useGLTF("/eye/scene.gltf");
  const secondGltf = useGLTF("/eye/scene.gltf");

  return (
    <>
      <primitive object={firstGltf.scene} position={[-200, 0, -400]} />
      <primitive object={secondGltf.scene} position={[200, 0, -400]} />
    </>
  );
}

export default function App() {
  return (
    <Canvas>
      <ambientLight color="white" intensity={0.5} />

      <Suspense fallback={null}>
        <MyContent />
      </Suspense>
    </Canvas>
  );
}
Run Code Online (Sandbox Code Playgroud)

请参阅此代码和框

然而,只有第二个<primitive>是可见的。如果我删除第二个<primitive>,则第一个可见。我正在努力理解为什么会发生这种情况以及如何做得更好。

(是因为第二次调用useGLTF …

three.js reactjs gltf react-three-fiber

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

useReducer 与 useState 相比实际上有什么优势?

我正在努力理解useReduceruseState. 有很多争论,但对我来说,没有一个真正有意义,在这篇文章中,我试图将它们应用到一个简单的例子中。

也许我错过了一些东西,但我真的不明白为什么useReducer应该在任何地方使用 over useState. 我希望你能帮助我澄清这一点。

让我们以这个例子为例:

版本 A - 使用 useState

function CounterControls(props) {
  return (
    <>
      <button onClick={props.increment}>increment</button>
      <button onClick={props.decrement}>decrement</button>
    </>
  );
}

export default function App() {
  const [complexState, setComplexState] = useState({ nested: { deeply: 1 } });

  function increment() {
    setComplexState(state => {
      // do very complex logic here that depends on previous complexState
      state.nested.deeply += 1;
      return { ...state };
    });
  }

  function decrement() {
    setComplexState(state => { …
Run Code Online (Sandbox Code Playgroud)

reactjs react-hooks use-reducer use-state

5
推荐指数
1
解决办法
213
查看次数

styled-components:使用额外的样式扩展现有组件

我正在使用 styled-components 来覆盖现有组件的样式,在这种情况下ToggleButton来自材料 ui。但是我希望我的新组件有一个额外的属性 ( hasMargin) 来控制样式:

import {ToggleButton} from "@material-ui/lab";
import styled, {css} from "styled-components";

const StyledToggleButton = styled(ToggleButton)<{ hasMargin?: boolean }>`
  && {
    color: red;

    ${props => props.hasMargin &&
      css`
          margin: 10px;
      `}
   }
`;
Run Code Online (Sandbox Code Playgroud)

我的意图是它的StyledToggleButton行为完全相同,ToggleButton但具有红色,并且可以使用附加属性调用hasMargin以打开边距 css。我想这样称呼它:

    <StyledToggleButton
      value={""} // ToggleButton prop
      size={"small"} // ToggleButton prop
      hasMargin={true} // My prop from StyledToggleButton
    >
      click
    </StyledToggleButton>
Run Code Online (Sandbox Code Playgroud)

但是如果我这样做,在浏览器控制台中我会得到:

Warning: React does not recognize the `hasMargin` prop on a DOM element.

这是因为, …

typescript reactjs material-ui styled-components

4
推荐指数
1
解决办法
1674
查看次数

Chrome-Dev-Tools 中的移动视图是否强制缩放?

在我看来,Chrome(与 Firefox 相比)在使用开发人员工具的移动视图时会自动缩小某些 html 内容:

以这个最小的例子为例:

<html>
    <head>
        <style>
            html {
                height: 100%;
            }
            body {
                height: 100%;
                margin: 0;
                font-size: 40px;
            }
            .test {
                background-color: lime;
                height: 100px;
                padding: 20px;
            }
        </style>
    </head>

    <body>
        <div class="test">Test Test Test</div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

对我来说,当进入移动视图时,绿色 div 的大小和字体大小相对于窗口宽度进行缩放。但是,我希望它具有恒定的高度100px。在正常视图中,一切都如预期,没有缩放。

我已在此 gif 中记录了此行为: Chrome Resizing

我对 css 是否有根本性的误解,或者这是 Chrome 的特殊行为?我应该如何创建恒定高度的 div,以便我可以在 Chrome 中使用它们?谢谢你!

html css mobile google-chrome

2
推荐指数
1
解决办法
2294
查看次数

React:在 useEffect 中调用上下文函数时防止无限循环

在我的 React 应用程序中,我渲染了不同的<Item>组件实例,我希望它们在上下文中注册/取消注册,具体取决于它们当前是否已安装。

我正在使用两个上下文(ItemContext提供已注册的项目,ItemContextSetters提供注册/取消注册的功能)来执行此操作。

const ItemContext = React.createContext({});
const ItemContextSetters = React.createContext({
  registerItem: (id, data) => undefined,
  unregisterItem: (id) => undefined
});

function ContextController(props) {
  const [items, setItems] = useState({});

  const unregisterItem = useCallback(
    (id) => {
      const itemsUpdate = { ...items };
      delete itemsUpdate[id];
      setItems(itemsUpdate);
    },
    [items]
  );

  const registerItem = useCallback(
    (id, data) => {
      if (items.hasOwnProperty(id) && items[id] === data) {
        return;
      }

      const itemsUpdate = { ...items, [id]: data }; …
Run Code Online (Sandbox Code Playgroud)

reactjs react-context react-hooks usecallback use-effect

2
推荐指数
1
解决办法
1516
查看次数