”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Three.js 的太阳能系统

使用 Three.js 的太阳能系统

发布于2024-11-04
浏览:758

Hi! Today, I’m going to build a solar system using Three.js. But before we begin, you should know that the inspiration for this article came from a client's representative whose project I’m currently working on. Yes, that's you—the one who believes the Earth is flat.

JavaScript/Node has largest ecosystem of libraries that cover enormous amount of feature that simplifies your development, so I always can choose which one is better for you purpose. However If we are talking about 3D graphics there is not that much cool options and three.js is probably the best amoug them all and has the biggest comunity.

So let's dive in Three.js and build the Solar system using it. In this article I will cover:

  • Init Project and Scene
  • Creating Sun
  • Creating Planets
  • Deploying to GitHub Pages

Init Project and Scene

First things first: to initialize the project, I'm using Vite and installing the Three.js dependency. Now, the question is how to set up Three.js. For this, you'll need three things: a scene, a camera, and a renderer. I'm also using the built-in addon, OrbitControls, which allows me to navigate within the scene. After starting the app, a black screen should appear.

import { Scene, WebGLRenderer, PerspectiveCamera } from "three";
import { OrbitControls } from "three/addons/controls/OrbitControls.js";

const w = window.innerWidth;
const h = window.innerHeight;

const scene = new Scene();
const camera = new PerspectiveCamera(75, w / h, 0.1, 100);
const renderer = new WebGLRenderer();
const controls = new OrbitControls(camera, renderer.domElement);

controls.minDistance = 10;
controls.maxDistance = 60;
camera.position.set(30 * Math.cos(Math.PI / 6), 30 * Math.sin(Math.PI / 6), 40);

renderer.setSize(w, h);
document.body.appendChild(renderer.domElement);

renderer.render(scene, camera);

window.addEventListener("resize", () => {
  const w = window.innerWidth;
  const h = window.innerHeight;
  renderer.setSize(w, h);
  camera.aspect = w / h;
  camera.updateProjectionMatrix();
});

const animate = () => {
  requestAnimationFrame(animate);
  controls.update();
  renderer.render(scene, camera);
};

animate();

You may notice that I'm limiting the zoom via controls and also changing the default angle of the camera. This will be helpful for properly displaying the scene in the next steps.

Now it’s time to add a simple starfield since our solar system should be surrounded by stars. To simplify the explanation, imagine you have a sphere, and you pick 1,000 random points on this sphere. Then, you create stars from these points by mapping a star texture onto them. Finally, I’m adding animation to make all these points spin around the y-axis. With this, the starfield is ready to be added to the scene.

import {
  Group,
  Color,
  Points,
  Vector3,
  TextureLoader,
  PointsMaterial,
  BufferGeometry,
  AdditiveBlending,
  Float32BufferAttribute,
} from "three";

export class Starfield {
  group;
  loader;
  animate;

  constructor({ numStars = 1000 } = {}) {
    this.numStars = numStars;

    this.group = new Group();
    this.loader = new TextureLoader();

    this.createStarfield();

    this.animate = this.createAnimateFunction();
    this.animate();
  }

  createStarfield() {
    let col;
    const verts = [];
    const colors = [];
    const positions = [];

    for (let i = 0; i  {
      requestAnimationFrame(this.animate);
      this.group.rotation.y  = 0.00005;
    };
  }

  getStarfield() {
    return this.group;
  }
}

Adding the starfield is easy, just by using add method in scene class

const starfield = new Starfield().getStarfield();
scene.add(starfield);

As for the textures, you can find all the textures used in this project inside the repository, which is linked at the end of the article. Most of the textures were taken from this site, with the exceptions being the star and planets' rings textures.


Creating Sun

For the sun, I used Icosahedron geometry and mapped a texture onto it. Using Improved Noise, I achieved an effect where the sun pulses, simulating the way a real star emits streams of energy into space. The sun isn't just a figure with a mapped texture; it also needs to be a light source in the scene, so I'm using PointLight to simulate this.

import {
  Mesh,
  Group,
  Color,
  Vector3,
  BackSide,
  PointLight,
  TextureLoader,
  ShaderMaterial,
  AdditiveBlending,
  DynamicDrawUsage,
  MeshBasicMaterial,
  IcosahedronGeometry,
} from "three";
import { ImprovedNoise } from "three/addons/math/ImprovedNoise.js";

export class Sun {
  group;
  loader;
  animate;
  corona;
  sunRim;
  glow;

  constructor() {
    this.sunTexture = "/solar-system-threejs/assets/sun-map.jpg";

    this.group = new Group();
    this.loader = new TextureLoader();

    this.createCorona();
    this.createRim();
    this.addLighting();
    this.createGlow();
    this.createSun();

    this.animate = this.createAnimateFunction();
    this.animate();
  }

  createSun() {
    const map = this.loader.load(this.sunTexture);
    const sunGeometry = new IcosahedronGeometry(5, 12);
    const sunMaterial = new MeshBasicMaterial({
      map,
      emissive: new Color(0xffff99),
      emissiveIntensity: 1.5,
    });
    const sunMesh = new Mesh(sunGeometry, sunMaterial);
    this.group.add(sunMesh);

    this.group.add(this.sunRim);

    this.group.add(this.corona);

    this.group.add(this.glow);

    this.group.userData.update = (t) => {
      this.group.rotation.y = -t / 5;
      this.corona.userData.update(t);
    };
  }

  createCorona() {
    const coronaGeometry = new IcosahedronGeometry(4.9, 12);
    const coronaMaterial = new MeshBasicMaterial({
      color: 0xff0000,
      side: BackSide,
    });
    const coronaMesh = new Mesh(coronaGeometry, coronaMaterial);
    const coronaNoise = new ImprovedNoise();

    let v3 = new Vector3();
    let p = new Vector3();
    let pos = coronaGeometry.attributes.position;
    pos.usage = DynamicDrawUsage;
    const len = pos.count;

    const update = (t) => {
      for (let i = 0; i  {
      const time = t * 0.00051;
      requestAnimationFrame(this.animate);
      this.group.userData.update(time);
    };
  }

  getSun() {
    return this.group;
  }
}

Creating Planets

All planets are built using a similar logic: each planet needs an orbit, a texture, an orbit speed, and a rotation speed. For planets that require them, rings should also be added.

import {
  Mesh,
  Color,
  Group,
  DoubleSide,
  RingGeometry,
  TorusGeometry,
  TextureLoader,
  ShaderMaterial,
  SRGBColorSpace,
  AdditiveBlending,
  MeshPhongMaterial,
  MeshBasicMaterial,
  IcosahedronGeometry,
} from "three";

export class Planet {
  group;
  loader;
  animate;
  planetGroup;
  planetGeometry;

  constructor({
    orbitSpeed = 1,
    orbitRadius = 1,
    orbitRotationDirection = "clockwise",

    planetSize = 1,
    planetAngle = 0,
    planetRotationSpeed = 1,
    planetRotationDirection = "clockwise",
    planetTexture = "/solar-system-threejs/assets/mercury-map.jpg",

    rimHex = 0x0088ff,
    facingHex = 0x000000,

    rings = null,
  } = {}) {
    this.orbitSpeed = orbitSpeed;
    this.orbitRadius = orbitRadius;
    this.orbitRotationDirection = orbitRotationDirection;

    this.planetSize = planetSize;
    this.planetAngle = planetAngle;
    this.planetTexture = planetTexture;
    this.planetRotationSpeed = planetRotationSpeed;
    this.planetRotationDirection = planetRotationDirection;

    this.rings = rings;

    this.group = new Group();
    this.planetGroup = new Group();
    this.loader = new TextureLoader();
    this.planetGeometry = new IcosahedronGeometry(this.planetSize, 12);

    this.createOrbit();
    this.createRings();
    this.createPlanet();
    this.createGlow(rimHex, facingHex);

    this.animate = this.createAnimateFunction();
    this.animate();
  }

  createOrbit() {
    const orbitGeometry = new TorusGeometry(this.orbitRadius, 0.01, 100);
    const orbitMaterial = new MeshBasicMaterial({
      color: 0xadd8e6,
      side: DoubleSide,
    });
    const orbitMesh = new Mesh(orbitGeometry, orbitMaterial);
    orbitMesh.rotation.x = Math.PI / 2;
    this.group.add(orbitMesh);
  }

  createPlanet() {
    const map = this.loader.load(this.planetTexture);
    const planetMaterial = new MeshPhongMaterial({ map });
    planetMaterial.map.colorSpace = SRGBColorSpace;
    const planetMesh = new Mesh(this.planetGeometry, planetMaterial);
    this.planetGroup.add(planetMesh);
    this.planetGroup.position.x = this.orbitRadius - this.planetSize / 9;
    this.planetGroup.rotation.z = this.planetAngle;
    this.group.add(this.planetGroup);
  }

  createGlow(rimHex, facingHex) {
    const uniforms = {
      color1: { value: new Color(rimHex) },
      color2: { value: new Color(facingHex) },
      fresnelBias: { value: 0.2 },
      fresnelScale: { value: 1.5 },
      fresnelPower: { value: 4.0 },
    };

    const vertexShader = `
    uniform float fresnelBias;
    uniform float fresnelScale;
    uniform float fresnelPower;

    varying float vReflectionFactor;

    void main() {
      vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
      vec4 worldPosition = modelMatrix * vec4( position, 1.0 );

      vec3 worldNormal = normalize( mat3( modelMatrix[0].xyz, modelMatrix[1].xyz, modelMatrix[2].xyz ) * normal );

      vec3 I = worldPosition.xyz - cameraPosition;

      vReflectionFactor = fresnelBias   fresnelScale * pow( 1.0   dot( normalize( I ), worldNormal ), fresnelPower );

      gl_Position = projectionMatrix * mvPosition;
    }
    `;

    const fragmentShader = `
      uniform vec3 color1;
      uniform vec3 color2;

      varying float vReflectionFactor;

      void main() {
        float f = clamp( vReflectionFactor, 0.0, 1.0 );
        gl_FragColor = vec4(mix(color2, color1, vec3(f)), f);
      }
    `;

    const planetGlowMaterial = new ShaderMaterial({
      uniforms,
      vertexShader,
      fragmentShader,
      transparent: true,
      blending: AdditiveBlending,
    });
    const planetGlowMesh = new Mesh(this.planetGeometry, planetGlowMaterial);
    planetGlowMesh.scale.setScalar(1.1);
    this.planetGroup.add(planetGlowMesh);
  }

  createRings() {
    if (!this.rings) return;

    const innerRadius = this.planetSize   0.1;
    const outerRadius = innerRadius   this.rings.ringsSize;

    const ringsGeometry = new RingGeometry(innerRadius, outerRadius, 32);

    const ringsMaterial = new MeshBasicMaterial({
      side: DoubleSide,
      transparent: true,
      map: this.loader.load(this.rings.ringsTexture),
    });

    const ringMeshs = new Mesh(ringsGeometry, ringsMaterial);
    ringMeshs.rotation.x = Math.PI / 2;
    this.planetGroup.add(ringMeshs);
  }

  createAnimateFunction() {
    return () => {
      requestAnimationFrame(this.animate);

      this.updateOrbitRotation();
      this.updatePlanetRotation();
    };
  }

  updateOrbitRotation() {
    if (this.orbitRotationDirection === "clockwise") {
      this.group.rotation.y -= this.orbitSpeed;
    } else if (this.orbitRotationDirection === "counterclockwise") {
      this.group.rotation.y  = this.orbitSpeed;
    }
  }

  updatePlanetRotation() {
    if (this.planetRotationDirection === "clockwise") {
      this.planetGroup.rotation.y -= this.planetRotationSpeed;
    } else if (this.planetRotationDirection === "counterclockwise") {
      this.planetGroup.rotation.y  = this.planetRotationSpeed;
    }
  }

  getPlanet() {
    return this.group;
  }
}

For Earth, I'm extending the Planet class to add extra textures, such as clouds and a night texture for the planet's night side.

import {
  Mesh,
  AdditiveBlending,
  MeshBasicMaterial,
  MeshStandardMaterial,
} from "three";
import { Planet } from "./planet";

export class Earth extends Planet {
  constructor(props) {
    super(props);

    this.createPlanetLights();
    this.createPlanetClouds();
  }

  createPlanetLights() {
    const planetLightsMaterial = new MeshBasicMaterial({
      map: this.loader.load("/solar-system-threejs/assets/earth-map-2.jpg"),
      blending: AdditiveBlending,
    });
    const planetLightsMesh = new Mesh(
      this.planetGeometry,
      planetLightsMaterial
    );
    this.planetGroup.add(planetLightsMesh);

    this.group.add(this.planetGroup);
  }

  createPlanetClouds() {
    const planetCloudsMaterial = new MeshStandardMaterial({
      map: this.loader.load("/solar-system-threejs/assets/earth-map-3.jpg"),
      transparent: true,
      opacity: 0.8,
      blending: AdditiveBlending,
      alphaMap: this.loader.load(
        "/solar-system-threejs/assets/earth-map-4.jpg"
      ),
    });
    const planetCloudsMesh = new Mesh(
      this.planetGeometry,
      planetCloudsMaterial
    );
    planetCloudsMesh.scale.setScalar(1.003);
    this.planetGroup.add(planetCloudsMesh);

    this.group.add(this.planetGroup);
  }
}

By searching on Google for about five minutes, you’ll come across a table with all the necessary values for adding planets to the scene.

Planet Size (diameter) Rotation speed Rotation direction Orbit speed
Mercury 4,880 km 10.83 km/h Counterclockwise 47.87 km/s
Venus 12,104 km 6.52 km/h Clockwise 35.02 km/s
Earth 12,742 km 1674.4 km/h Counterclockwise 29.78 km/s
Mars 6,779 km 866.5 km/h Counterclockwise 24.07 km/s
Jupiter 142,984 km 45,300 km/h Counterclockwise 13.07 km/s
Saturn 120,536 km 35,500 km/h Counterclockwise 9.69 km/s
Uranus 51,118 km 9,320 km/h Clockwise 6.81 km/s
Neptune 49,528 km 9,720 km/h Counterclockwise 5.43 km/s

Now, all the planets and the sun can be added to the scene.

const planets = [
  {
    orbitSpeed: 0.00048,
    orbitRadius: 10,
    orbitRotationDirection: "clockwise",
    planetSize: 0.2,
    planetRotationSpeed: 0.005,
    planetRotationDirection: "counterclockwise",
    planetTexture: "/solar-system-threejs/assets/mercury-map.jpg",
    rimHex: 0xf9cf9f,
  },
  {
    orbitSpeed: 0.00035,
    orbitRadius: 13,
    orbitRotationDirection: "clockwise",
    planetSize: 0.5,
    planetRotationSpeed: 0.0005,
    planetRotationDirection: "clockwise",
    planetTexture: "/solar-system-threejs/assets/venus-map.jpg",
    rimHex: 0xb66f1f,
  },
  {
    orbitSpeed: 0.00024,
    orbitRadius: 19,
    orbitRotationDirection: "clockwise",
    planetSize: 0.3,
    planetRotationSpeed: 0.01,
    planetRotationDirection: "counterclockwise",
    planetTexture: "/solar-system-threejs/assets/mars-map.jpg",
    rimHex: 0xbc6434,
  },
  {
    orbitSpeed: 0.00013,
    orbitRadius: 22,
    orbitRotationDirection: "clockwise",
    planetSize: 1,
    planetRotationSpeed: 0.06,
    planetRotationDirection: "counterclockwise",
    planetTexture: "/solar-system-threejs/assets/jupiter-map.jpg",
    rimHex: 0xf3d6b6,
  },
  {
    orbitSpeed: 0.0001,
    orbitRadius: 25,
    orbitRotationDirection: "clockwise",
    planetSize: 0.8,
    planetRotationSpeed: 0.05,
    planetRotationDirection: "counterclockwise",
    planetTexture: "/solar-system-threejs/assets/saturn-map.jpg",
    rimHex: 0xd6b892,
    rings: {
      ringsSize: 0.5,
      ringsTexture: "/solar-system-threejs/assets/saturn-rings.jpg",
    },
  },
  {
    orbitSpeed: 0.00007,
    orbitRadius: 28,
    orbitRotationDirection: "clockwise",
    planetSize: 0.5,
    planetRotationSpeed: 0.02,
    planetRotationDirection: "clockwise",
    planetTexture: "/solar-system-threejs/assets/uranus-map.jpg",
    rimHex: 0x9ab6c2,
    rings: {
      ringsSize: 0.4,
      ringsTexture: "/solar-system-threejs/assets/uranus-rings.jpg",
    },
  },
  {
    orbitSpeed: 0.000054,
    orbitRadius: 31,
    orbitRotationDirection: "clockwise",
    planetSize: 0.5,
    planetRotationSpeed: 0.02,
    planetRotationDirection: "counterclockwise",
    planetTexture: "/solar-system-threejs/assets/neptune-map.jpg",
    rimHex: 0x5c7ed7,
  },
];

planets.forEach((item) => {
  const planet = new Planet(item).getPlanet();
  scene.add(planet);
});

const earth = new Earth({
  orbitSpeed: 0.00029,
  orbitRadius: 16,
  orbitRotationDirection: "clockwise",
  planetSize: 0.5,
  planetAngle: (-23.4 * Math.PI) / 180,
  planetRotationSpeed: 0.01,
  planetRotationDirection: "counterclockwise",
  planetTexture: "/solar-system-threejs/assets/earth-map-1.jpg",
}).getPlanet();

scene.add(earth);

In result all solar system will look sth like:

Solar system with Three.js

Deploying to GitHub Pages

For deploying to set the correct base in vite.config.js.

If you are deploying to https://.github.io/, or to a custom domain through GitHub Pages, set base to '/'. Alternatively, you can remove base from the configuration, as it defaults to '/'.

If you are deploying to https://.github.io// (eg. your repository is at https://github.com//), then set base to '//'.

Go to your GitHub Pages configuration in the repository settings page and choose the source of deployment as "GitHub Actions", this will lead you to create a workflow that builds and deploys your project, a sample workflow that installs dependencies and builds using npm is provided:

# Simple workflow for deploying static content to GitHub Pages
name: Deploy static content to Pages

on:
  # Runs on pushes targeting the default branch
  push:
    branches: ['main']

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# Sets the GITHUB_TOKEN permissions to allow deployment to GitHub Pages
permissions:
  contents: read
  pages: write
  id-token: write

# Allow one concurrent deployment
concurrency:
  group: 'pages'
  cancel-in-progress: true

jobs:
  # Single deploy job since we're just deploying
  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Set up Node
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'
      - name: Install dependencies
        run: npm ci
      - name: Build
        run: npm run build
      - name: Setup Pages
        uses: actions/configure-pages@v4
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          # Upload dist folder
          path: './dist'
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4

That is it. If your deployment has not started automatically you can always start it manually in Actions tab in your repo. Link with deployed project can be found below.


Conclusion

That’s it for today! You can find the link to the entire project below. I hope you found this entertaining and don’t still believe the Earth is flat.
See ya!

Repository link

Deployment link

版本声明 本文转载于:https://dev.to/cookiemonsterdev/solar-system-with-threejs-3fe0?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 您真的可以信任 $_SERVER['REMOTE_ADDR'] 吗?
    您真的可以信任 $_SERVER['REMOTE_ADDR'] 吗?
    $_SERVER['REMOTE_ADDR']的可靠性$_SERVER['REMOTE_ADDR']是Web开发中的一个重要变量,提供发起 HTTP 请求的客户端的 IP 地址。然而,有一个常见的误解,认为该值很容易被欺骗,从而导致对其可信度的担忧。$_SERVER[...
    编程 发布于2024-11-18
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-18
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-18
  • 如何使用 PDO 设置连接超时?
    如何使用 PDO 设置连接超时?
    使用 PDO 设置连接超时:综合指南使用 PHP 数据对象 (PDO) 连接到数据库时,如果以下情况,在获取异常时会遇到较长的延迟:服务器不可用可能会令人沮丧。此问题通常在使用 PDO::setAttribute() 方法之前出现。要建立连接超时,可以使用替代方法。通过将选项数组传递给 PDO 构造...
    编程 发布于2024-11-18
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-18
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-11-18
  • 如何通过代理服务器发出CURL请求?
    如何通过代理服务器发出CURL请求?
    如何通过代理使用 CURL通过代理服务器使用 CURL 允许您通过中介建立连接来访问受限内容或绕过地理限制。要实现此目的,请按照下列步骤操作:1。定义目标 URL 和代理配置:将您要访问的目标 URL 分配给 $url 变量。在 $proxy 中指定代理服务器和端口多变的。使用格式“IP_ADDRE...
    编程 发布于2024-11-18
  • 为什么 `background-size: cover` 在 Mobile Safari 上失败以及如何修复?
    为什么 `background-size: cover` 在 Mobile Safari 上失败以及如何修复?
    克服背景大小的限制:Mobile Safari 中的覆盖iOS 设备在实现背景图像时面临着独特的挑战,使用background-size: cover覆盖整个元素。尽管是预期的行为,但此属性通常会在这些平台上产生不良结果。为了解决此问题,出现了一种巧妙的解决方法。通过调整背景附件属性以在专门针对 i...
    编程 发布于2024-11-18
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-18
  • 如何在 CSS 中模糊背景图像而不影响前景内容?
    如何在 CSS 中模糊背景图像而不影响前景内容?
    用 CSS 模糊背景:避免内容模糊模糊背景可以增强网站美感并将注意力集中在关键内容上。但是,如果模糊无意中影响了内容本身怎么办?在此示例中,尝试模糊背景图像,同时保留 span 元素内前景文本的清晰度。为了实现这一点,可以策略性地使用CSS。关键技术是利用:before伪类来继承背景图像。引入了类为...
    编程 发布于2024-11-18
  • 如何使用共享相同名称的行中的数据更新表中的 NULL 值?
    如何使用共享相同名称的行中的数据更新表中的 NULL 值?
    使用同表同级的数据更新行设想一个具有类似于以下结构的表:ID名称值1测试VALUE12测试2VALUE21测试2NULL4测试NULL1Test3VALUE3您的任务是使用具有相同“NAME”的其他行的数据填充 NULL“VALUE”单元格(即“Test”和“Test2”应该继承其前身的值)。期望的...
    编程 发布于2024-11-18
  • 如何使用危险的SetInnerHTML在React中安全地渲染HTML字符串?
    如何使用危险的SetInnerHTML在React中安全地渲染HTML字符串?
    安全地将 HTML 字符串渲染为 HTML在这种情况下,尝试渲染正常的 HTML 内容字符串时会出现问题,但它而是显示为字符串而不被解释为 HTML。当angerlySetInnerHTML 中使用的属性是对象而不是字符串时,通常会遇到这种情况。要解决此问题,请确保 this.props.match...
    编程 发布于2024-11-18
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2024-11-18
  • \"\" 是关闭 HTML Span 标记的有效方法吗?
    \"\" 是关闭 HTML Span 标记的有效方法吗?
    ”是关闭 HTML Span 标记的有效方法吗? " />HTML Span可以用“”关闭吗?用“”铰链关闭HTML Span的有效性XHTML在遵循 XML 标准的 XHTML 中,所有主流浏览器都识别自闭合标签,例如“ For”。例如,考虑以下有效的 XHTML 代码:&lt...
    编程 发布于2024-11-18
  • 如何通过从数组传递参数来排序 Promise 执行?
    如何通过从数组传递参数来排序 Promise 执行?
    通过数组传递参数来顺序执行 Promise考虑这样的场景:您有一个值数组(例如,myArray)并且需要执行一个 Promise-顺序地基于函数(例如 myPromise),将每个数组元素作为参数传递。如何实现一个“可暂停循环”来确保 Promise 以正确的顺序得到解决?解决方案:迭代 Promi...
    编程 发布于2024-11-18

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3