react native切换页面闪烁_史上最贴心React渲染器开发辅导

15be39cb7a00b93dc0893f6093c0562c.png

这个故事要从几年前,React 和 react-dom 离婚说起,先插一嘴,第三者不是张三(纯博人眼球)。

React 刚流行起来时,并没有 react-dom ,突然有一天,React 发达了,想学时间管理,然后阅人无数,就这样 React 成了王,而 react-dom 与之分开沦为了妾,React 可谓妻妾成群,我们随便举几个例子: React-Native 、Remax 等。为啥 React 如此无情?我摊牌了,编不下去了,就说好好写文章他不香吗?

正儿八经的,我们开始!

相信大家对于跨端这个概念不陌生,什么是跨端?就是让你感觉写一套代码可以做几个人的事,比如,我用 React 可以写Web 、可以写小程序 、可以写原生应用,这样能极大降低成本,但其实,你的工作交给 React 去做了,我们可以对应一下:

•web:react-dom•小程序:remax•ios、android:react-native

这样一捋是不是清晰了?我们再看一张图

63920bbef892bf9f85883c742ee3a979.png

到这里,你是否明白了当初 React 和 react-dom 分包的用意了?React 这个包本身代码量很少,他只做了规范和api定义,平台相关内容放在了与宿主相关的包,不同环境有对应的包面对,最终展现给用户的是单单用 React 就把很多事儿做了。

那按这样说,我们是不是也可以定义自己的React渲染器?当然可以,不然跟着这篇文章走,学完就会,会了还想学。

创建React项目

首先使用React脚手架创建一个demo项目

安装脚手架

npm i -g create-react-app

创建项目

create-react-app react-custom-renderer

运行项目

yarn start

现在我们可以在vs code中进行编码了

修改 App.js 文件源码

import React from "react";import "./App.css";class App extends React.Component {
      constructor(props) {
        super(props);    this.state = {
          count: 0,    };  }  handleClick = () => {
        this.setState(({ count }) => ({ count: count + 1 }));  };  render() {
        const { handleClick } = this;    const { count } = this.state;    return (      <div className="App">        <header className="App-header" onClick={handleClick}>          <span>{count}span>        header>      div>    );  }}export default App;

打开浏览器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Native 中,使用 Three.js 渲染器需要使用 `react-native-webgl` 库,而该库中的 WebGLRenderer 并不支持设置渲染器的位置。不过我们可以通过将 canvas 元素包裹在一个 View 中,再设置该 View 的样式来实现类似的效果。 具体的实现方式如下: ```jsx import React, { useRef, useEffect } from 'react'; import { View } from 'react-native'; import { GLView } from 'react-native-webgl'; import * as THREE from 'three'; const Example = () => { const rendererRef = useRef(null); useEffect(() => { if (rendererRef.current) { const renderer = rendererRef.current.getContext('webgl', { antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; const scene = new THREE.Scene(); const geometry = new THREE.BoxGeometry(1, 1, 1); const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); const cube = new THREE.Mesh(geometry, material); scene.add(cube); const animate = () => { requestAnimationFrame(animate); cube.rotation.x += 0.01; cube.rotation.y += 0.01; renderer.render(scene, camera); }; animate(); } }, []); return ( <View style={{ position: 'absolute', top: 50, left: 50 }}> <GLView style={{ width: 300, height: 300 }} ref={rendererRef} /> </View> ); }; export default Example; ``` 在上面的代码中,我们将 `GLView` 组件(即 Three.js 渲染器的 canvas 元素)放在了一个 `View` 组件中,并设置了该 `View` 组件的样式来控制渲染器的输出位置。需要注意的是,由于 `GLView` 组件是异步加载的,因此我们需要在 useEffect 中等待它被加载完毕之后才能对其进行操作。 最后,我们通过 `renderer.render(scene, camera)` 方法将场景渲染到屏幕上,并通过 `requestAnimationFrame` 实现了动画效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值