reactjs中使用threejs从0到1
搭建本地开发环境
- 安装nodejs
- 按照 Create React App 安装指南创建一个新的项目
npx create-react-app react-three-demo
删除掉新项目中
src/文件夹下的所有文件。(不要删除整个src文件夹,删除里面的源文件。)安装路由依赖包和threejs依赖包
# tips: 注意版本兼容问题
npm install react-router@5 react-router-dom@5
npm install --save three
- 按照下面目录结构创建文件
-public
└─src
├─assets
│ └─styles
├─routers
│ └─index.js
└─views
│ ├─home.js
│ └─demo.js
├─index.js // 入口文件
├─app.js // 主文件
组件和路由文件
- 路由文件
import { Route } from 'react-router-dom'
import Index from '../views/index'
import Demo from '../views/demo'
// 路由配置
const Routes = [
{
path: '/',
exact: true,
component: Index
},
{
path: '/Demo',
exact: true,
component: Demo
}
]
function AppRouter() {
return (
<main>
{Routes.map((item, index) => {
return <Route key={index} path={item.path} exact={item.exact} component={item.component}></Route>
})}
</main>
)
}
export default AppRouter
- 入口文件index.js
import React from 'react'
import ReactDOM from 'react-dom/client'
import './assets/styles/base.css'
import App from './App'
const root = ReactDOM.createRoot(document.getElementById('root'))
// 注意,不要使用严格模式去渲染,否则会导致 componentDidMount 钩子执行两次
root.render(<App />)
- app.js
import { BrowserRouter as Router, Link } from 'react-router-dom'
import AppRouter from './routers'
function App() {
return (
<Router>
<div className="App">
<nav>
<Link to="/">首页</Link>
<Link to="/Demo">demo</Link>
</nav>
<AppRouter></AppRouter>
</div>
</Router>
)
}
export default App
- 首页 home.js
import { Component } from 'react'
import * as THREE from 'three'
// import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
export default class Index extends Component {
render() {
return <div id="stage"></div>
}
/**
* @Description: 组件挂载完成
* @return {*}
*/
componentDidMount() {
this.init()
this.animate()
}
/**
* @Description: 初始化
* @return {*}
*/
init = () => {
this.scene = new THREE.Scene()
this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / (window.innerHeight - 33), 0.1, 1000)
this.renderer = new THREE.WebGLRenderer()
this.renderer.setSize(window.innerWidth, window.innerHeight - 33)
document.getElementById('stage').appendChild(this.renderer.domElement)
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 })
this.cube = new THREE.Mesh(geometry, material)
this.scene.add(this.cube)
this.camera.position.z = 5
}
/**
* @Description: 旋转动画
* @return {*}
*/
animate = () => {
requestAnimationFrame(this.animate)
this.cube.rotation.x += 0.01
this.cube.rotation.y += 0.01
this.renderer.render(this.scene, this.camera)
}
}
package.json文件
{
"name": "react-three-demo",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "set PORT=8888 && react-scripts start",
"build": "react-scripts build"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router": "^5.3.3",
"react-router-dom": "^5.3.3",
"react-scripts": "5.0.1",
"three": "^0.143.0",
}
}
备注
搞这个小demo的过程中遇到一些问题,总结如下:
nodejs版本要足够新,否则可能创建项目不成功
npx create-react-app创建项目报错(不报错的忽略)
npm ERR! code ENOLOCAL
npm ERR! Could not install from "Files\nodejs\node_cache\_npx\1452" as it does not contain a package.json file. npm ERR! A complete log of this run can be found in:
npm ERR! C:\Program Files\nodejs\node_cache\_logs\2022-08-04T14_46_10_318Z-debug.log
Install for create-react-app@latest failed with code 1
解决方法:
检查本地用户下的 .npmrc 文件配置,去掉config配置,重新创建项目即可。
如果还不行那就重新安装node吧
路由报错,页面空白
Uncaught Error: Invariant failed: You should not use <Switch> outside a <Router>
那可能是react-router和react-router-dom的版本不兼容,或者是路由位置放错了。
本文使用的 v5 版本,写法可以参考本文路由文件也可自己尝试其他方式。
threejs创建的3D图形,canvas渲染出现两个
// 注意入口文件中使用的是严格模式,导致 componentDidMount 钩子执行两次,init函数执行两次造成的
// 解决方法:要么去掉严格模式,要不操作dom控制只有一个canvas元素,本文使用第一种方法
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
)
// 解决方法一
root.render(<App />)
使用threejs 做demo过程中注意,方法使用箭头函数方便定义和使用变量,定义变量可以直接放在当前实例上。
reactjs中使用threejs从0到1的更多相关文章
- Eclipse中部署hadoop2.3.0
1 eclipse中hadoop环境部署概览 eclipse 中部署hadoop包括两大部分:hdfs环境部署和mapreduce任务执行环境部署.一般hdfs环境部署比较简单,部署后就 可以在ecl ...
- 宏定义中使用do{}while(0)的好处 (转载)
宏定义中使用do{}while(0)的好处 #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定 ...
- VS2015预览版中的C#6.0 新功能(二)
VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(三) 自动属性的增强 只读自动属性 以前自动属性必须同时提供setter和getter方法,因而只读属性只能通 ...
- VS2015预览版中的C#6.0 新功能(三)
VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(二) Using static 使用using StaticClass,你可以访问StaticClass类里的 ...
- VS2015预览版中的C#6.0 新功能(一)
VS2015预览版中的C#6.0 新功能(二) VS2015预览版中的C#6.0 新功能(三) VS2015的预览版在11月12日发布了,下面让我们来看看C#都提供了哪些新的功能. 字符串添写(Str ...
- 输入框中的空"",0,null的判断
改了一个小项目,里面有一个小的问题他们是这样提需求的.两个输入框,第一个输入框里面,输入的内容会对第二个输入框中的内容产生影响.具体是这样的:如果第一个输入框中的值不是“0”,那么第二个输入框就不能填 ...
- Mybatis中 Integer 值为0时,默认为空字符串的解决办法。
需求是查询级别为0的用户 User对象里的level字段的值为0,查询时居然没有查到为level为0的用户. <select id="selectSelective" par ...
- 数组中&a与&a[0]的区别 转载自http://blog.csdn.net/FX677588/article/details/74857473
在探讨这个问题之前,我们首先来看一道笔试题,如下: [摘自牛客网]下列代码的结果是:(正确答案是 C) main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)( ...
- IIS7.5中调试.Net 4.0网站出现无厘头500错误的解决办法 (转)
刚刚 部署了ii7的dll的有x86写的,就会出现以下这样的问题 iis 7 x86,Could not load file or assembly 'Name' or one of its depe ...
随机推荐
- 力扣算法JS LC 59-螺旋矩阵2,LC 152-乘积最大子数组
LC 59-螺旋矩阵2 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . 示例 1: 输入:n = 3输出:[[1,2 ...
- netty系列之:使用Jboss Marshalling来序列化java对象
目录 简介 添加JBoss Marshalling依赖 JBoss Marshalling的使用 总结 简介 在JAVA程序中经常会用到序列化的场景,除了JDK自身提供的Serializable之外, ...
- 29. Divide Two Integers - LeetCode
Question 29. Divide Two Integers Solution 题目大意:给定两个数字,求出它们的商,要求不能使用乘法.除法以及求余操作. 思路:说下用移位实现的方法 7/3=2, ...
- 146_ACCESS之HR招聘信息管理_64位
焦棚子的文章目录 点击下载附件 一.背景: 最近把之前做的一个HR招聘信息管理工具翻新了下,有需要的朋友可以自取,主要想解决的问题是多人在跟进人员招聘的时候信息的不对称,这样下来的就可以及时的看到整个 ...
- 线上问题定位利器 jprofiler
1.导出dump windows: jps -l 查看Java进行 jmap -dump:format=b,file=webapi.hprof 20840 查看进程,根据进程号导出hprof文件 ...
- 想知道Vue3与Vue2的区别?五千字教程助你快速上手Vue3!
从Vue3发布以来,我就一直对其非常感兴趣,就一直想着将其投入公司的生产中,但是开始考虑到很多不确定性就暂时对一些很小的功能进行一些尝试:慢慢的发现组合式Api的形式非常适合开发(个人感觉),尤其是V ...
- Tomcat部署界面使用burp爆破
打开界面显示私密连接,正常抓包. 抓包查看Authorization的数据 Basic 后面的数据是经过base64加密后的.格式为admin:123456 勾选对应参数,payload设置为Cust ...
- 使用Node.js还可以发邮件
前言 今天,我们给大家开发一个小效果.篇幅比较短,主要给大家展示效果.实战 首先我们初始化一个Node项目 npm init -y 创建一个app.js文件 'use strict'; const n ...
- ASP.NET MVC的核心-Controller(控制器)
"每一个请求都必须通过Controller处理,然而其中有些请求是不需要模型和视图的" MVC框架规定带Controller后缀的类称为所谓的"控制器",在xx ...
- centos 7安装zabbix
1 升级系统组件到最新版本 yum -y update 2 关闭 SELinux sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" / ...