【问题标题】:Binding methods in react componentsReact 组件中的绑定方法
【发布时间】:2016-09-14 01:34:22
【问题描述】:

当我尝试将值绑定到组件函数 handleInput 时出现错误: 未捕获的类型错误:无法读取未定义的属性“绑定”

但是,当我将 input 元素插入到 render 方法底部的 return 语句中时,它不会产生任何错误。我猜这与渲染方法的生命周期有关,但我不确定。

感谢任何见解。

至于代码的作用,它从 this.props.info.text 中检索一个字符串,并将 的所有实例替换为一个 html 输入框,然后附加到一个 div。在用户输入时,这些值会传播到父组件。

export default class Line extends React.Component {

 constructor() {
   super();
 }

 handleInput(id, e) {
   console.log(id);
   this.props.handleCode(e.target.value);
 }

 shouldComponentUpdate(){
   if (document.getElementById('otherClass').innerHTML.length == 0){
     return true;
   }
   return false;
 }

 render() {
   var id = this.props.id;
   let codeVal = "";
   let codeDiv = document.createElement('div');
   if (typeof(this.props.info) !== 'undefined') {
     //breaks here
     codeVal = this.props.info.text.replace(/<= var[0-9] =>/, '<input type="text" onInput=this.handleInput.bind(this,id)></input>');
     let index = codeVal.indexOf('<');
     let splits = [codeVal.slice(0, index), codeVal.slice(index)];
     codeDiv.innerHTML = "<div class='row'><div class='col-md-6'>"+splits[0]+"</div><div class='col-md-6'>"+splits[1]+ "</div></div>";
     document.getElementById('otherClass').appendChild(codeDiv);
   }

   return(
     <div id='otherClass'></div>
   );

 }
}

父代码:

export default class StateVal extends React.Component {
  handleCode(id, e){
    console.log("value propagated on user input");
    alert(e);
  }
  render() {
    return (
     <div className="col-md-6">
       <div className="card-block">
        < Line info={this.props.data.codeBody[0]} handleCode={this.handleCode} id={1} />
     </div>
   </div>
  );
}
}

编辑:想法是,如果我通过诸如“int value = ”之类的道具检索文本值,我如何将其转换为响应式html输入标签,例如

 int value = <input type='text' onInput=this.handleInput.bind(this, id)/>

然后在html中渲染

【问题讨论】:

  • 这……有点疯狂。为什么要使用 dom api 创建元素并将它们附加到渲染的组件中?为什么不直接制作 &lt;div /&gt; 等 React 组件?
  • html 应该是动态的。这就是为什么我使用正则表达式并且不能只返回一个普通的 div。这是一个示例道具文本值: int value = 我应该将其转换为 int value =
  • 您可以发布父代码吗?这是一个丑陋的黑客,我认为这种方法行不通,如果您可以提供有关要求的更多信息,您可能会得到更好的答案。
  • 我同意另外两个。我不确定你想要实现的动态,但我相信 React 很容易做到这一点。另外,你应该使用 JSX 在 React 组件中注入一个函数。
  • @user2998285 React 中的一切都只是 JavaScript! JavaScript 几乎是动态的。只需根据状态和道具渲染组件。无论如何都不要打扰 DOM api。

标签: javascript reactjs reactive-programming


【解决方案1】:

使用 react 从字符串生成 Html 时,您只能编写有效的 HTML。

&lt;input type='text' onInput=this.handleInput.bind(this, id)/&gt; 无效:onInput 不是 HTML valid props

Generating a jsx string 到 HTML 与 react 是需要babel 的特殊情况。

我认为您不能使用字符串即时在组件中插入 jsx 字符串,但可能还有另一种解决方案。将您的字符串拆分为一个数组,并用不是字符串代码"&lt;../&gt;" 而是用jsx 元素&lt;...&gt; 替换匹配的字符串。此 jsx 元素将根据需要将函数绑定到您的组件。我在这里找到了类似的解决方案:Replace part of string with tag in JSX

【讨论】:

  • 好吧,你不能生成 jsx 字符串是有道理的。但 onInput 是一个有效的 html 事件属性。 w3schools.com/tags/ref_eventattributes.asp
  • 是的,但是在一个 javascript &lt;script&gt; 标记中。不是在重新编写 html 时(有或没有 jsx)。我只是更新解决方案。这有帮助吗?
  • 谢谢,最后一部分帮助了我很多。
【解决方案2】:

有一种正确的方法可以用 react 渲染字符串:

在 React 中使用 dangerouslySetInnerHTML 将 HTML 作为字符串注入。主题被处理here

问候

【讨论】:

  • 谢谢,我想我的问题不是很清楚,但问题不仅仅是渲染 html,还确保 handleInput 绑定到 'this' 和 'id. '这就是我遇到麻烦的地方。我不断收到错误提示未定义handleInput,或无法读取未定义的属性“绑定”。
【解决方案3】:

您可以像下面那样在末尾设置绑定关键字,而不是您给出的示例。

onInput=this.handleInput(id).bind(this)

或者只是在这里调用这个方法并在构造函数级别绑定它。

onInput=this.handleInput(id)

constructor() {
   super();
   this.handleInput=this.handleInput.bind(this);
 }

【讨论】:

  • 感谢您的意见。不幸的是,我仍然遇到错误。 this.handleInput 不是函数。
  • 也尝试只使用一个参数进行测试
  • 是的,我认为 onInput 必须在 return 语句中呈现 - 因此 this.handleInput 不是函数。但是我在返回之前修改了props的值,
  • 所以问题仍然存在?
  • 你能解释一下你想要达到的目标吗?你不应该用字符串替换来操作元素,因为有多个尖括号
猜你喜欢
  • 1970-01-01
  • 2018-09-27
  • 2019-02-10
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 2021-10-16
  • 2017-03-15
  • 2019-01-04
相关资源
最近更新 更多