GVKun编程网logo

findDOMNode 在带有 React.createRef() 的 StrictMode 中被弃用(find_element())

13

想了解findDOMNode在带有React.createRef()的StrictMode中被弃用的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于find_element()的相关问题,此外

想了解findDOMNode 在带有 React.createRef() 的 StrictMode 中被弃用的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于find_element()的相关问题,此外,我们还将为您介绍关于constructor 执行了两次?- 浅淡 React StrictMode、findDOMNode 在 StrictMode 中已弃用 Reactjs 中出现错误、java – ObjectMapper().createObjectNode与JsonNodeFactory.instance.objectNode()之间的区别?、node.js中的fs.createReadStream方法使用说明_node.js的新知识。

本文目录一览:

findDOMNode 在带有 React.createRef() 的 StrictMode 中被弃用(find_element())

findDOMNode 在带有 React.createRef() 的 StrictMode 中被弃用(find_element())

如何解决findDOMNode 在带有 React.createRef() 的 StrictMode 中被弃用?

我正在使用一个功能组件来启动一个弹出表单。我想在提交时获取表单中的值,并在输入字段中使用 variable = React.createRef() 然后使用 ref={variable} 来检索它们,但我一直在获取

Warning: findDOMNode is deprecated in Strictmode

控制台中的错误。有没有更好的方法来做到这一点?

Const AddProduct = (section) => {
 const [show,setShow] = useState(false);
 const handleClose = () => setShow(false);
 const handleShow = () => setShow(true);

 let itemName = React.createRef();

 const createProduct = () => {
    
   console.log(itemName.current.value);
   handleClose();
 };

 return (
   <>
     <a href="#" className="nav-link" onClick={handleShow}>
       Add Product
     </a>

     <Modal show={show} onHide={handleClose}>
       <Modal.Header>
         <Modal.Title>Create Item</Modal.Title>
       </Modal.Header>
       <Modal.Body>
         <Form.Group controlId="itemName">
           <Form.Label>Item Name</Form.Label>
           <Form.Control type="text" name="name" ref={itemName} />   
</Form.Group>
       </Modal.Body>
       <Modal.Footer>
         <Button variant="secondary" onClick={handleClose}>
           Close
         </Button>
         <Button variant="primary" onClick={createProduct}>
           Create
         </Button>
       </Modal.Footer>
     </Modal>
   </>
 );
};

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

constructor 执行了两次?- 浅淡 React StrictMode

constructor 执行了两次?- 浅淡 React StrictMode

https://juejin.im/post/5e64d3eff265da57671bd080


前言

StrictModeReact16.3 版本新增的一个组件,按照官方的说法:

StrictMode 是一个用来突出显示应用程序中潜在问题的工具。与 Fragment 一样,StrictMode 不会渲染任何可见的 UI。它为其后代元素触发额外的检查和警告。

我相信很多人和我一样都知道 StrictMode 类似 JavaScript 中的 use strict, 可以让 React 程序在更严格的条件下运行,也已经在项目中使用了它,但是还是不太了解 StrictMode 怎样检测出程序的问题。下面就通过一个问题抛砖引玉,给大家简单的介绍一下 StrictMode

问题

大家可以先看一下上面的这段简单的代码,思考一下最终在页面上展示的值也就是 App 组件里 state.id 的值会是多少?

我相信大家对 React 有了解的话就会不假思索地说出 state.id = 1 这个答案,这个答案在生产环境中确实是正确答案,毕竟在 React 的官方文档中告诉了我们 Class Componentconstructor 只会在渲染时执行一次。但是你在开发环境中运行的时候,显示的答案并不如我们所想,来一起康康 运行的结果 吧:

一个大大的 2 出现在了我们的屏幕上。为什么会是 2,不是说好的 constructor 只会执行一次吗?难道 React 骗了我们?

这个问题出现的“罪魁祸首”就是 React.StrictMode,它在开发环境中将 constructor 函数调用了两次,至于为什么调用两次?其实为了检测意外的副作用,通过调用两次的方式将一些隐藏地比较深的副作用放大,让开发者更好的发现它。详情的内容可以查看下面的介绍。

StrictMode 功能介绍

1、检测意外的副作用

从概念上讲,React 分两个阶段工作:

渲染 阶段会确定需要进行哪些更改,比如 DOM。在此阶段,React 调用 render,然后将结果与上次渲染的结果进行比较。 提交 阶段发生在当 React 应用变化时。(对于 React DOM 来说,会发生在 React 插入,更新及删除 DOM 节点的时候。)在此阶段,React 还会调用 componentDidMountcomponentDidUpdate 之类的生命周期方法。 提交阶段通常会很快,但渲染过程可能很慢。因此,即将推出的 concurrent 模式 (默认情况下未启用) 将渲染工作分解为多个部分,对任务进行暂停和恢复操作以避免阻塞浏览器。这意味着 React 可以在提交之前多次调用渲染阶段生命周期的方法,或者在不提交的情况下调用它们(由于出现错误或更高优先级的任务使其中断)。

渲染阶段的生命周期包括以下 class 组件方法:

- constructor
- componentWillMount (or UNSAFE_componentWillMount)
- componentWillReceiveProps (or UNSAFE_componentWillReceiveProps)
- componentWillUpdate (or UNSAFE_componentWillUpdate)
- getDerivedStateFromProps
- shouldComponentUpdate
- render
- setState 更新函数(第一个参数)
复制代码

因为上述方法可能会被多次调用,所以不要在它们内部编写副作用相关的代码,这点非常重要。忽略此规则可能会导致各种问题的产生,包括内存泄漏和或出现无效的应用程序状态。不幸的是,这些问题很难被发现,因为它们通常具有非确定性。

严格模式不能自动检测到你的副作用,但它可以帮助你发现它们,使它们更具确定性。通过在开发环境下故意重复调用以下方法来实现的该操作:

- class 组件的 constructor 方法
- render 方法
- setState 更新函数 (第一个参数)
- 静态的 getDerivedStateFromProps 生命周期方法
复制代码

以上这段话全都来自于 React 的官方中文文档,因为文档上已经对于 StrictMode 是为什么要检测意外的副作用以及怎么检测意外的副作用介绍得实在太详细了,笔者觉得没啥好补充的了,就直接搬运了过来。

render 方法为例,简单看下 StrictMode 关于检测意外的副作用的实现:

真的就像文档介绍的那么简单,仅仅只是对方法调用了两次,没有任何的比较之类的动作。

2、识别不安全的生命周期

React16.3 版本中将一些生命周期方法列为了不安全的生命周期。至于为什么这些生命周期方法是不安全的,可以参考这篇博客的开头,主要还是考虑到了使用这些生命周期的代码在 React 的未来版本中更有可能出现 bug。

  • componentWillMount
  • componentWillReceiveProps
  • componentWillUpdate

StrictMode 就可以帮助我们检测代码中是否有使用到这些不安全的生命周期方法。在 Class Component 实例化完成后,会去组件实例上寻找有没有 componentWillMountUNSAFE_componentWillMount 这些不安全的生命周期的方法,有就 push 到一个数组里,最后统一在控制台发出警告️。代码实现比较简单,感兴趣可以看下ReactStrictModeWarnings.js 中的 recordUnsafeLifecycleWarningsflushPendingUnsafeLifecycleWarnings 这两个方法。

3、对于使用废弃的 findDOMNode 方法的警告

React 支持用 findDOMNode 来在给定 class 实例的情况下在树中搜索 DOM 节点。通常你不需要这样做,因为你可以将 ref 直接绑定到 DOM 节点。

findDOMNode 也可用于 class 组件,但它违反了抽象原则,它使得父组件需要单独渲染子组件。它会产生重构危险,你不能更改组件的实现细节,因为父组件可能正在访问它的 DOM 节点。findDOMNode 只返回第一个子节点,但是使用 Fragments,组件可以渲染多个 DOM 节点。findDOMNode 是一个只读一次的 API。调用该方法只会返回第一次查询的结果。如果子组件渲染了不同的节点,则无法跟踪此更改。因此,findDOMNode 仅在组件返回单个且不可变的 DOM 节点时才有效。

这段话也来自官方文档,因为findDOMNode 的这些问题,所以React 决定在 StrictMode 中废弃它,在调用 findDOMNode 会去判断是否在 StrictMode 模式下,有则在控制台打印出警告。

4、检测过时的 context API

因为旧的 Context API 在 context 的值有更新时,没办法保证所有子节点一定能更新(因为中间父组件的 shouldComponentUpdate 返回 false,那么使用到该值的后代组件不会进行更新)的问题,所以 React 在 16.3 版本提出了新的 Context API,所以在 StrictMode 中会检测应用中是否使用到了过时的 Context API

由于老的 Context API 会在 Context 提供者上绑定 childContextTypesgetChildContext 以及在 在 Context 的使用者上绑定用来访问 context 的 contextTypes 属性,所以 StrictMode 只要在组件实例化完成后判断实例上有没有这几个属性就能判断是否使用了老的 Context API,然后作出统一的警告。

5、对于使用字符串 ref API 的警告

这部分内容虽然官方文档上有提到,但是经过笔者的实验,并不能在 StrictMode 下对使用了 string ref API 的行为在控制台产生警告,所以就不在这里多做提及。

写在最后

StrictMode 确实可以帮助我们让 React 程序运行地更好,更健壮,这个毋庸置疑。但是笔者认为在检测意外的副作用这一点上 React 做的对开发者不够友好吧,虽然对于一部分方法调用两次可以更容易发现出意外的副作用,但是对于刚接触 React 的人或者对 StrictMode 了解不够的人来说,在开发的时候更可能会认为是 React 出了问题或者自己的写法有问题,导致了重复调用,浪费不必要的 debug 时间。这一方面可能需要做出更友好的提示。

findDOMNode 在 StrictMode 中已弃用 Reactjs 中出现错误

findDOMNode 在 StrictMode 中已弃用 Reactjs 中出现错误

如何解决findDOMNode 在 StrictMode 中已弃用 Reactjs 中出现错误?

一切正常,但是当我第一次提交数据时,出现了这个错误。 findDOMNode 在 StrictMode 中已弃用。 findDOMNode 传递了一个位于 StrictMode 内的 Transition 实例。相反,直接向要引用的元素添加 ref。 我做错了什么?

import {Button,FormControl,FormHelperText,Grid,IconButton,InputAdornment,makeStyles,Paper,Snackbar,TextField,Typography} from ''@material-ui/core'';

import React from ''react'';
import PersonIcon from ''@material-ui/icons/Person'';
import {Visibility,VisibilityOff} from ''@material-ui/icons'';
import InputLabel from ''@material-ui/core/InputLabel'';
import Input from ''@material-ui/core/Input'';
import VpnKeyIcon from ''@material-ui/icons/VpnKey'';
import {Link,useHistory} from ''react-router-dom''
import Alert from ''@material-ui/lab/Alert'';


const [isError,setError] = React.useState({
    nameError : false,passError : false,isErrorAlert : false
})
const [openAlert,setAlert] = React.useState(false);
//Destructuring
const {name,password} = RegisterUser;
//Functions

const HandleCloseAlert = () =>{
    setAlert(false)
}

const HandleOpenAlert = () => {
    setAlert(true)
}


const HandleRegister = () =>{
    if((name === '''' || name === null) && (password === '''' || password === null)){
        return setError({...isError,nameError : true,passError : true})
    }
    else if((password === '''' || password === null)){
        return setError({...isError,nameError : false,passError : true})
    }
    else if((name === '''' || name === null)){
        return setError({...isError,passError : false})
    }
    // else if(!ValidUsername.test(name)){
    //     setError({nameError : true,isErrorAlert : false})
    // }
        else{
            if(Users.length === 0){
                const UserObject = {}
                UserObject.name = name
                UserObject.password = password
                let newArray = [...Users,UserObject]
                setUsers(newArray)
                localStorage.setItem(''users'',JSON.stringify(newArray))
                // setError({...isError,isErrorAlert : false})
                HandleOpenAlert();
            }
            else{
                let UserName_array = JSON.parse(localStorage.getItem(''users'')).map(user=>user.name)
                let found = UserName_array.includes(name)
                if(found){
                    setError({...isError,isErrorAlert : true})
                    // HandleOpenAlert();
                    alert(''taken'')
                }
                else{

                    const UserObject = {}
                    UserObject.name = name
                    UserObject.password = password
                    let newArray = [...Users,UserObject]
                    setUsers(newArray)
                    localStorage.setItem(''users'',JSON.stringify(newArray))
                    setError({...isError,isErrorAlert : false})
                    HandleOpenAlert();
                }
            }
    }
    

}
return ( 
    <div>
        <div className={classes.MainWrapper}>
            <>
            <Snackbar
            anchorOrigin={{
            horizontal : ''center'',vertical : ''top''
            }}
            open = {openAlert}
            autoHideDuration = {1000}
            onClose = {HandleCloseAlert}
            >
            <Alert severity=''success'' variant=''filled'' onClose = {HandleCloseAlert}>''registed''</Alert>  
            </Snackbar>
            </>
        
            <Paper elevation = {3} className = {classes.Paper}>
                <Typography variant = ''h5'' style={{margin : ''10px''}}>Register</Typography>
                <div className={classes.FormWrapper}>
                    <form>
                        <Grid container spacing={2} alignItems="flex-end">
                            <Grid item>
                                <PersonIcon/>
                            </Grid>
                            <Grid item>
                            <TextField
                            name = ''name''
                            type = ''text''
                            label="Username" 
                            size = ''medium''
                            error = {isError.nameError? true : false }
                            helperText={isError.nameError? ''Please Enter username correctly'': ''''}
                            value = {RegisterUser.name}
                            onChange = {HandleChange}
                            
                            />
                            </Grid>
                        </Grid>
                        <br />
                        <Grid container spacing={2} alignItems="flex-end">
                            <Grid item>
                                <VpnKeyIcon/>
                            </Grid>
                            <Grid item>
                            <FormControl error = {isError.passError? true : false }>
                                <InputLabel htmlFor="standard-adornment-password">Password</InputLabel>
                                <Input
                                id="standard-adornment-password"
                                type={RegisterUser.showPassword? ''text'' : ''password''}
                                name = ''password''
                                style={{width : ''200px''}}
                                value = {RegisterUser.password}
                                onChange = {HandleChange}
                                endAdornment={
                                <InputAdornment position="end">
                                    <IconButton
                                    aria-label="toggle password visibility"
                                      onClick={HandleClickShowPassword}
                                    >
                                        {RegisterUser.showPassword ? <Visibility /> : <VisibilityOff />}
                                    </IconButton>
                                </InputAdornment>
                                }
                                />
                                <FormHelperText id="component-helper-text">{isError.passError?''Please enter password'':''''}</FormHelperText>
                                </FormControl>
                            </Grid>
                        </Grid>
                        <br />
                        <Button variant=''contained'' color=''secondary'' onClick={HandleRegister} style={{marginTop : ''10px'',marginBottom : ''10px''}}>Register</Button>
                        <br />
                        <Typography style = {{fontSize : ''14px''}}>Already Logged in? <Link to = ''/''>SignIn</Link></Typography>

                    </form>
                </div>
            </Paper>
        </div>
        
    </div> 
 );

}

导出默认注册;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

java – ObjectMapper().createObjectNode与JsonNodeFactory.instance.objectNode()之间的区别?

java – ObjectMapper().createObjectNode与JsonNodeFactory.instance.objectNode()之间的区别?

我看到一个 post关于向JsonNode插入新节点并遇到两个单独的答案,但我无法理解两者之间的区别.

根据我的经验,ObjectMapper不允许您创建除ObjectNode和ArrayNode之外的任何内容,而JsonNodeFactory允许您创建a whole bunch of nodes.

除此之外,还有什么其他差异?

另外,鉴于ObjectMapper是considered expensive,我想知道后一种方法是否更有效?

解决方法

以下方法之间没有区别:

ObjectMapper mapper = new ObjectMapper();
ObjectNode objectNode = mapper.createObjectNode();
ObjectNode objectNode = JsonNodeFactory.instance.objectNode();

在幕后,杰克逊将把createObjectNode()方法委托给JsonNodeFactory.

有关如何使用JsonNodeFactory的更多详细信息,请参阅此answer.

node.js中的fs.createReadStream方法使用说明_node.js

node.js中的fs.createReadStream方法使用说明_node.js

方法说明:

返回一个readStream(文件读取流,输入流)对象。(可读流)

语法:

复制代码 代码如下:

fs.createReadStream(path, [options])

由于该方法属于fs模块,使用前需要引入fs模块(var fs= require(“fs”) )

接收参数:

path: (string) 欲读取的文件路径

options : (object) 数组对象包含以下属性

复制代码 代码如下:

{ flags: ''r'',
  encoding: null,
  fd: null,
  mode: 0666,
  autoClose: true
}

options 可以通过start 和 end 设置 文件 可读取的字节数范围,而不是读取整个文件。

如果start 和 end都被包含的情况下 ,将从0开始。

encodeing 可以是 ‘utf8′, ‘ascii'', 或 ‘base64′三种格式。

如果autoClose为false时,文件描述符将不会被关闭,即使他们报错了。

最好把它关闭掉 并确保不会出现文件描述符泄漏。

如果autoClose为true时(默认的行为),对错误或结束的文件描述符将自动关闭。

例子:

该例子将读取一个100k的文件中的最后10十字节内容。

复制代码 代码如下:

fs.createReadStream(''sample.txt'', {start: 90, end: 99});

源码:

复制代码 代码如下:

fs.createReadStream = function(path, options) {
  return new ReadStream(path, options);
};

我们今天的关于findDOMNode 在带有 React.createRef() 的 StrictMode 中被弃用find_element()的分享就到这里,谢谢您的阅读,如果想了解更多关于constructor 执行了两次?- 浅淡 React StrictMode、findDOMNode 在 StrictMode 中已弃用 Reactjs 中出现错误、java – ObjectMapper().createObjectNode与JsonNodeFactory.instance.objectNode()之间的区别?、node.js中的fs.createReadStream方法使用说明_node.js的相关信息,可以在本站进行搜索。

本文标签:

上一篇UFuncTypeError: ufunc 'matmul' 不包含具有签名匹配类型 (dtype(' dtype('

下一篇在不使用 Multer 的情况下从 NodeJS 读取通过 PostMan 或其他客户端上传的文件