来自父级的 TextField 默认值未在子级上呈现

Posted

技术标签:

【中文标题】来自父级的 TextField 默认值未在子级上呈现【英文标题】:TextField default value from parent not rendering on child 【发布时间】:2019-12-26 20:46:15 【问题描述】:

我正在使用 Reactjs 处理从父组件获取一些 defaultValues 的表单。

问题是,父组件使用 axios post 设置值的状态,并将这些值作为 props 传递给子组件。我可以使用 console.log 在子组件上打印这些值,但是如果我尝试将这些值放在 TextFields 上的 defaultValues 上,我得到一个空表单,表单上不会呈现任何值。

父组件:

export default class Parent extends Component 
   constructor(props)
      super(props);
      this.state=
         somevalue: '',
      
   

   componentDidMount()
      this.getData();
   

   getData = async () => 
      await api.post('/getValue')
      .then((res) => 
         this.setState(
            someValue: res.data;
         )
      ).catch((err) => 
         console.log("Error: ", err);
      )
   

   render()
      return(
         <Child value=this.state.someValue/>
      )

子组件

export default function Child(props) 
   console.log(props.value); // THIS LOG PRINT THE VALUE PROPERLY
   return(
      <TextField defaultValue=props.value/>
   )

这基本上是我的代码结构,但它不起作用。此后 TextField 仍然为空。

【问题讨论】:

【参考方案1】:

属性defaultValue 仅用于初始渲染。如果您检查您的代码,您会看到在 console.log 输出值之前,它将首先输出 undefined。您可以通过将defaultValue 更改为value 将其更改为受控组件。这样会显示值,但您需要为值的更改添加 onChange 处理程序。

function Child(props) 
    // Using the value prop your value will display, but you will also have to pass an onChange handler to update the state in the parent
    return <TextField value=props.value />;

或者你可以等到值可用后再渲染你的组件

const  someValue  = this.state;
if (!someValue) 
  return "loading the data";

return <Child value=someValue />;

这取决于具体情况,哪种解决方案会更好。但我认为您可能希望更新输入中的值并对其进行处理,所以我会选择第一种情况。

【讨论】:

感谢您的回答先生 :D 这就是诀窍!只需使用“if (!someValue)”,defaultValue 就可以根据需要工作。 看到您对答案的编辑,第二个解决方案对我来说效果更好,因为我的一些加载元素。我直接在子组件中处理这些值,并使用 axios 将它们发送回我的服务器。另外,我没有使用 TextField 值,而是使用 defaultValue 并根据需要工作。再次感谢您。

以上是关于来自父级的 TextField 默认值未在子级上呈现的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?

如果在子级上验证失败,则不会在父级上调用IValidatableObject.Validate

css父级没包住子级是怎么回事,我用firebug查看,确实在父级的div中,但是就是没有包括子级的内容

React,是不是在父级上渲染会使子级重新渲染?

nHibernate 保存一对多

Swift 3.0 如何在 Firebase 中的父级上添加子级