首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当我在父程序中使用一个自组织组件时,应重新设置我的备忘组件

当我在父程序中使用一个自组织组件时,应重新设置我的备忘组件
EN

Stack Overflow用户
提问于 2020-05-06 13:32:49
回答 2查看 1K关注 0票数 0

我有一个问题,一个图像闪烁,因为它是无缘无故地呈现,尽管使用React.memo,尽管它的道具或状态不被改变。

我成功地使用了这里,正确地利用了React.memo,BUUUT,因为一个我不明白的原因,如果我在父组件中使用一个高阶组件,那么备忘录就不再工作了,我又遇到了闪烁的问题。

这是一个说明问题的小吃。

以下是代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as React from 'react';
import { Text, View, StyleSheet } from 'react-native';

let interval = null

const Icon = ({ name }) => {
  // We emulate a rerender of the Icon by logging 'rerender' in the console
  console.log('rerender')
  return <Text>{name}</Text>
}

const Memo = React.memo(Icon, () => true)

const withHOC = (Comp) => (props) => {
  return <Comp {...props}/>
}

export default function App() {
  const [state, setState] = React.useState(0)
  const name = 'constant'
  // Change the state every second
  React.useEffect(() => {
    interval = setInterval(() => setState(s => s+1), 1000)
    return () => clearInterval(interval)
  }, [])
  // Remove this line and replace NewView by View to see the expected behaviour
  const NewView = withHOC(View)
  return (
    <NewView>
      <Memo name={name} />
    </NewView>
  );
}

我不明白为什么我的特写打破了回忆录,我不知道如何防止闪烁在我的应用程序,仍然能够使用特别.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-06 14:04:52

您正在重新创建您的呈现函数中的临时属性。因此,在呈现之间,该组件的任何子组件都不能保持一致。

如果您将临时创建移出呈现之外,那么它将工作!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Text = 'span';
const View = 'div';

let interval = null

const Icon = ({ name }) => {
  // We emulate a rerender of the Icon by logging 'rerender' in the console
  console.log('rerender')
  return <Text>{name}</Text>
}

const Memo = React.memo(Icon, () => true)

const withHOC = (Comp) => (props) => {
  return <Comp {...props}/>
}

// move it out here!
// 
const NewView = withHOC(View)
// 

function App() {
  const [state, setState] = React.useState(0)
  const name = 'constant'
  // Change the state every second
  React.useEffect(() => {
    interval = setInterval(() => setState(s => s+1), 1000)
    return () => clearInterval(interval)
  }, [])
  // Remove this line and replace NewView by View to see the expected behaviour
  
  return (
    <NewView>
      <Memo name={name} />
    </NewView>
  );
}
ReactDOM.render(<App />, document.querySelector('#root'));
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>

编辑:我在另一个回答中看到了你的评论。

好的,但是我如何在我的组件中使用临时的呢?因为我需要为专案小组提供道具和州政府.

如果您确实需要在组件中创建自组织,您可以使用useMemo包装它,因为如果useMemo的依赖项没有改变,React将保留在呈现之间的特殊引用(注意:如果钩子依赖项在每次呈现时发生变化,这将无法工作)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function App() {
  // ...
  const NewView = useMemo(() => withHOC(View), []);
}

虽然这是可行的,但它可能有点不稳定。一般来说,钩子和HOCs不是一起使用的模式。反应核心团队创建了钩子来取代HOCs。在你继续走这条路之前,我想看看你是否可以把你的专案写成一个钩子。我想你会发现这更自然。

票数 4
EN

Stack Overflow用户

发布于 2020-05-06 14:08:54

在每次重呈现时,您都会创建一个新的NewView,因此旧的(以及您的Icon)将被销毁。因此,它实际上并不是在Icon上发生的重呈现,而是一个 Icon的全新呈现。

如果您将const NewView = withHOC(View)移出您的App函数,您的HOC将被调用一次,创建一个将用于每次重呈现的NewView,这将防止您的Icon也被销毁,并且在您回忆录中,您可以安全地避免不必要的重呈现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as React from 'react';
import { Text, View, StyleSheet } from 'react-native';

let interval = null

const Icon = ({ name }) => {
  // We emulate a rerender of the Icon by logging 'rerender' in the console
  console.log('rerender')
  return <Text>{name}</Text>
}

const Memo = React.memo(Icon, () => true)

const withHOC = (Comp) => (props) => {
  return <Comp {...props}/>
}

const NewView = withHOC(View);

export default function App() {
  const [state, setState] = React.useState(0)
  const name = 'constant'
  // Change the state every second
  React.useEffect(() => {
    interval = setInterval(() => setState(s => s+1), 1000)
    return () => clearInterval(interval)
  }, [])
  // Remove this line and replace NewView by View to see the expected behaviour
  return (
    <NewView>
      <Memo name={name} />
    </NewView>
  );
}

为了更好地理解正在发生的事情,我在您的这里组件上添加了一个日志NewView,这样您就可以看到该组件在每个父版本的重新呈现上都会卸载,而它必须通过创建一个全新的NewView和一个回忆录Icon来销毁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61645789

复制
相关文章
vue中父组件传值给子组件,父组件值改变,子组件不能重新渲染[通俗易懂]
这个方法感觉props’接收数据在调用方法之后,明明父组件的值已经改变了,但是父组件在调用子组件方法时,数据仍然没有 接收到,调用之后才接收到,这个方法暂且没用,应该是声明ref的时候声明的是当前组件的实例,然后调用时调用的也是值未改变时的属性。这个没什么用,可以用来调用子组件方法。
全栈程序员站长
2022/11/16
3K0
在 Vue 中,父组件中传递数据给子组件
在父组件中传递数据给子组件。在 Vue 中,可以通过 props 属性来实现父组件向子组件传递数据的功能。
王小婷
2023/09/11
3180
vue子组件传值给父组件_子组件调用父组件中的方法
大家好,又见面了,我是你们的朋友全栈君。 参考视频 : https://www.bilibili.com/video/av32790541/?spm_id_from=trigger_reload 原
全栈程序员站长
2022/10/04
4.2K0
vue子组件传值给父组件_子组件调用父组件中的方法
vue中在父组件点击按钮触发子组件的事件
1、父组件的button元素绑定click事件,该事件指向notify方法 2、给子组件注册一个ref=“child” 3、父组件的notify的方法在处理时,使用了$refs.child把事件传递给子组件的parentMsg方法,同时携带着父组件中的参数msg 4、子组件接收到父组件的事件后,调用了parentMsg方法,把接收到的msg放到message数组中
江一铭
2022/06/16
6.3K0
在 Vue 中,子组件如何向父组件传递数据?
在子组件中,使用 $emit 方法触发一个自定义事件,并传递要传递给父组件的数据作为参数。
王小婷
2023/09/03
6350
父组件向子组件传递一个组件
leader755
2023/07/31
1400
vue父组件中获取子组件中的数据
<FormItem label="上传头像" prop="image"> <uploadImg :width="150" :height="150" :name="'avatar'" size="150px*150px" ref="avatar"></uploadImg> </FormItem> <FormItem label="上传营业执照" prop="businessLicence"> <uploadImg :width="350" :heigh
蓓蕾心晴
2018/04/12
6.9K0
Vue 父子组件通信传值(子组件中使用父组件中的数据)
1. 父传子 props ---- 父组件中的数据传递给子组件 官方文档:通过-Prop-向子组件传递数据 props: ['movies'] props: { movies: Array }, props: { movies: { type: Array, default: [], required: true } }, props 的驼峰标识 <cpn :c-info="userinfo"></cpn> props: { c
很酷的站长
2023/02/17
2.6K0
Vue 父子组件通信传值(子组件中使用父组件中的数据)
小程序子组件向父组件传值_小程序组件通信
需要在子组件处添加 bind:traCheckedNum=”checkNum” checkNum是父js中的方法
全栈程序员站长
2022/10/04
3290
vue 父组件调用子组件的函数_vue子组件触发父组件方法
项目里将element-ui的el-upload写成公共组件方便调用,官方的before-upload方法用于处理上传前要做的事,如:比较文件大小,限制文件类型等,通过返回true 或 false 控制是否上传。 当该组件调用父组件方法,并且要能获取到父组件方法的返回值,如何实现?
全栈程序员站长
2022/11/10
3K0
React中父组件执行子组件的函数 使用class + onRef写法
在React中,父组件执行子组件的函数的写法如下 父组件中 添加函数 onRef = (ref) => { this.child = ref } 在使用子组件时 <ChildComponet onRef={this.onRef} /> onRef是固定的用法, 在子组件里 componentDidMount(){ this.props.onRef(this) } 父组件执行子组件的函数 submitFun = () => { this.child.onReset(); }
拿我格子衫来
2022/01/24
3.6K0
小程序父组件向子组件传值
子组件:tabs1 父组件:demo04 先将子组件和父组件直接产生特定的联系,需要在demo04.json里面以键值对的方式添加。
全栈程序员站长
2022/08/30
5920
小程序父组件向子组件传值
vue 父组件调用子组件的方法_vue子组件修改父组件值
我们都知道通过$ref可以获取到某个DOM,但是它也可以用来获取子组件的实例,调用子组件的方法
全栈程序员站长
2022/11/09
2K0
子组件传对象给父组件_react子组件改变父组件的状态
sendData = () => { let data = ‘1234’; this.props.getData(data); //这个this,props.xxx 后面的xxx是是在父组件那使用的名字; }, 然后可以在render函数后使用这个方法或者另外定义一个事件去触发该方法进行传值,
全栈程序员站长
2022/10/04
2.8K0
Vue 在父(子)组件引用其子(父)组件方法和属性
<button @click="callChildMethod()">父组件调用子组件方法</button>
授客
2020/06/23
1.9K0
Vuejs中父组件主动调用子组件的方法
我们都知道,vue是单向流,但是有时候我们需要在父组件中主动通知子组件一些信息,使其做出一些响应变化,那么如何在父组件中去主动调用子组件的方法呢?Vue当然给我们提供了方法,如下:
飞奔去旅行
2019/06/13
5K0
vue中父组件和子组件交互的方式
vue中使用component来表示组件,通过封装组件,我们可以将代码最大程度的复用,可以说组件是vue中的核心。
程序那些事儿
2023/03/07
5.8K0
vue中父组件和子组件交互的方式
react子组件向父组件传递数据_react子组件改变父组件的状态
本博客代码是 React 父组件和子组件相互传值的 demo;实现封装一个折线图,折线图选择下拉框,获取下拉框点击的值并且传给父组件根据下拉框筛选的条件更新视图;效果图如下:
全栈程序员站长
2022/10/03
3.6K0
react子组件向父组件传递数据_react子组件改变父组件的状态
Taro中的一个父组件中map渲染子组件列表的时候,问题
我们在开发的时候,组件和页面一定要分开,如果是组件的话,就一定不要当成页面组件在pages中配置,就拿列表组件来说
耙耳朵
2020/06/11
2K0
vue子组件调用父组件函数_vue子组件修改父组件值
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
1.7K0

相似问题

子组件在父组件重新渲染时重新渲染

326

子组件应呈现类似父组件中的同级组件。

20

当通过子组件更改父状态时,应重新呈现

11

当父级在功能组件中更改其状态时,应重新设置子状态。

26

更新状态时应重新呈现组件

34
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文