【问题标题】:Show text instead of console log显示文本而不是控制台日志
【发布时间】:2020-09-24 18:05:41
【问题描述】:

我想在文本组件中显示文本而不是控制台记录它。我已经在一个函数中获得了信息,现在它只是控制台记录它。我想从函数中获取信息并将其放入状态中,然后通过从状态中抓取来显示。

state = {
    displayName: firebase.auth().currentUser.displayName,
    email: firebase.auth().currentUser.email,
    familyName: this.getFamilyName(),
  };

  getFamilyName() {
    return firebase
      .firestore()
      .collection("users")
      .doc(firebase.auth().currentUser.email)
      .get()
      .then(function (doc) {
        if (doc.exists) {
          console.log(doc.data().familyname);
          return doc.data().familyname;
        } else {
          // doc.data() will be undefined in this case
          console.log("No such document!");
        }
      })
      .catch(function (error) {
        console.log("Error getting document:", error);
      });
  }

  render() {
    return (
      <ScrollView>
        <View>
          <ThemeProvider>
            <Text style={{ textAlign: "center", top: 20, fontSize: 14 }}>
              FAMILIE
            </Text>
            <Text h2 style={{ textAlign: "center", top: 20 }}>
              {this.state.familyName}
            </Text>

更新。看起来它不会转移到状态。当我控制台记录状态时,它说未定义。:

state = {
    displayName: firebase.auth().currentUser.displayName,
    email: firebase.auth().currentUser.email,
    familyName: this.getFamilyName(),
  };

  getFamilyName() {
    return firebase
      .firestore()
      .collection("users")
      .doc(firebase.auth().currentUser.email)
      .get()
      .then(function (doc) {
        if (doc.exists) {
          console.log("1st" + doc.data().familyname);
          const name = doc.data().familyname;
          this.setState({ familyName: name });
        } else {
          // doc.data() will be undefined in this case
          console.log("No such document!");
        }
      })
      .catch(function (error) {
        console.log("Error getting document:", error);
      });
  }

  render() {
    console.log("2nd" + this.state.familyName);
    return (
      <ScrollView>
        <View>
          <ThemeProvider>
            <View>
              <Text style={{ textAlign: "center", top: 20, fontSize: 14 }}>
                FAMILIE
              </Text>
              <Text h2 style={{ textAlign: "center", top: 20 }}>
                {this.state.familyName}
              </Text>
            </View>

输出

2ndundefined
1stVilholm
Error getting document: [TypeError: undefined is not an object (evaluating 'this.setState')]

【问题讨论】:

    标签: reactjs firebase react-native google-cloud-firestore


    【解决方案1】:

    您可以setState familyName

        if (doc.exists) {
              console.log(doc.data().familyname);
              this.setState({'familyName':doc.data().familyname})
            }
    

    现在 Text 组件会向您显示 familyName

          <Text h2 style={{ textAlign: "center", top: 20 }}>
              {this.state.familyName&&this.state.familyName}
          </Text>
    

          <Text h2 style={{ textAlign: "center", top: 20 }}>
              {this.state?.familyName}
          </Text>
    

    把你的函数写成箭头函数

    getFamilyName=()=> {
        return firebase
          .firestore()
          .collection("users")
          .doc(firebase.auth().currentUser.email)
          .get()
          .then((doc)=> {
            if (doc.exists) {
              console.log("1st" + doc.data().familyname);
              const name = doc.data().familyname;
              this.setState({ familyName: name });
            } else {
              // doc.data() will be undefined in this case
              console.log("No such document!");
            }
          })
          .catch(function (error) {
            console.log("Error getting document:", error);
          })}
    

    【讨论】:

    • 感谢您的回答。当我尝试这个时,它给了我这个错误“警告:失败的道具类型:无效的道具children 类型为array 提供给Overlay,需要一个ReactElement”
    • 我已经更新了我的答案。您可以尝试用 View 包装两个 Text 组件吗
    • 所以获取信息到视图有问题。我试图打印出不同地方的名称和未定义的地方之一。我将在我的问题中更新代码和输出。
    • @MariusVilholm 你还有问题吗?如果有的话,请随时询问:)
    【解决方案2】:

    不要使用 firebase 设置初始状态,而是将其初始化为默认值,然后在检索信息时您只会丢失一个 setState,只需执行以下操作:

    state = {
        displayName: firebase.auth().currentUser.displayName,
        email: firebase.auth().currentUser.email,
        familyName: '',
      };
    
      getFamilyName() {
        return firebase
          .firestore()
          .collection("users")
          .doc(firebase.auth().currentUser.email)
          .get()
          .then(function (doc) {
            if (doc.exists) {
              console.log(doc.data().familyname);
    
              const name = doc.data().familyname;
              this.setState({ familyName: name )}
    
          } else {
              // doc.data() will be undefined in this case
              console.log("No such document!");
            }
          })
          .catch(function (error) {
            console.log("Error getting document:", error);
          });
      }
    
      render() {
        return (
          <ScrollView>
            <View>
              <ThemeProvider>
                <Text style={{ textAlign: "center", top: 20, fontSize: 14 }}>
                  FAMILIE
                </Text>
                <Text h2 style={{ textAlign: "center", top: 20 }}>
                  {this.state.familyName}
                </Text>
    

    如果你想在 doc 不存在时处理错误,你可以这样做:

    
          } else {
              // doc.data() will be undefined in this case
              this.setState({familyName: false})
            }
          })
    
    

    然后在render函数中处理familyName的值(可能用三元运算符)

    【讨论】:

    • 感谢您的回答。当我尝试使用它时,它给了我这个错误“获取文档时出错:[TypeError: undefined is not an object (evalating 'this.setState')]”
    • 这(也许,因为您没有发布任何错误行或更多代码)与 doc.data() 相关。尝试记录/使用调试器查看 doc.data() 及其结构,可能它是空的,或者该特定文档的属性 familyname 不存在
    【解决方案3】:

    使用生命周期方法 componentDidMount()。将初始状态定义为空字符串。

    state = {
        displayName: '',
        email: '',
        familyName: '',
      };
    
    componentDidMount() {
        this.setState({familyName : firebase.auth().currentUser.displayName })
        this.setState({familyName : firebase.auth().currentUser.email })
        this.setState({familyName : this.getFamilyName() })
    }
    

    如果你想在别处设置状态,你可以更新字段为

    this.setState( { familyName : "Your String" } )
    

    您可以将状态变量用作 {this.state.familyName} 在您的 Text 标记内呈现视图。请注意,更改状态变量会自动重新渲染组件。

    【讨论】:

    • 感谢答案。当我尝试使用它时,它给了我错误“对象作为 React 子项无效(找到:带有键 {_40、_65、_55、_72} 的对象)。如果您打算渲染一组子项,请使用数组而是。”
    猜你喜欢
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多