React.js - রেন্ডারিংয়ের সময় ইনপুট হারানো ফোকাস


106

আমি কেবল পাঠ্য ইনপুটটিতে লিখছি এবং onChangeইভেন্টে আমি কল করি setState, সুতরাং প্রতিক্রিয়াটি আমার ইউআইকে রেন্ডার করে। সমস্যাটি হ'ল পাঠ্য ইনপুটটি সর্বদা একটি ফোকাস হারাতে থাকে, সুতরাং প্রতিটি অক্ষরের জন্য আমার আবার এটি ফোকাস করা দরকার: ডি।

var EditorContainer = React.createClass({

    componentDidMount: function () {
        $(this.getDOMNode()).slimScroll({height: this.props.height, distance: '4px', size: '8px'});
    },

    componentDidUpdate: function () {
        console.log("zde");
        $(this.getDOMNode()).slimScroll({destroy: true}).slimScroll({height: 'auto', distance: '4px', size: '8px'});
    },

    changeSelectedComponentName: function (e) {
        //this.props.editor.selectedComponent.name = $(e.target).val();
        this.props.editor.forceUpdate();
    },

    render: function () {

        var style = {
            height: this.props.height + 'px'
        };
        return (
            <div className="container" style={style}>
                <div className="row">
                    <div className="col-xs-6">
                    {this.props.selected ? <h3>{this.props.selected.name}</h3> : ''}
                    {this.props.selected ? <input type="text" value={this.props.selected.name} onChange={this.changeSelectedComponentName} /> : ''}
                    </div>
                    <div className="col-xs-6">
                        <ComponentTree editor={this.props.editor} components={this.props.components}/>
                    </div>
                </div>
            </div>
        );
    }

});

একমাত্র কারণটি ঘটবে যদি হ'ল ক) অন্য কোনও কিছু ফোকাস চুরি করে, বা খ) ইনপুটটি ঝলকানি দিচ্ছে। আপনি কি সমস্যাটি দেখিয়ে একটি জেসফিল ​​/ জেসবিন সরবরাহ করতে পারেন? এখানে একটি বেস প্রতিক্রিয়া jsbin
ব্রিগেন্ড

4
হ্যাঁ ... বেশ খানিকটা বিরক্তিকর শোনার জন্য: P jquery দিয়ে আমি নতুন রেন্ডার করা ইনপুট ফাইলের জন্য একটি সনাক্তকারী সেট করব এবং তারপরে এটিতে ফোকাস কল করব। কীভাবে কোডটি সাদামাটা জেএসে প্রদর্শিত হবে তা নিশ্চিত নয়। তবে আমি নিশ্চিত যে আপনি এটি করতে পারবেন :)
মেডদা 86

4
@ ফেকরাইনব্রিগান্ড: ঝাঁকুনির অর্থ কী?
ক্রাব

@ ক্র্যাব, পছন্দ করুন যদি এটি। এর ফলে ইনপুটটি আনমাউন্ট হবে না এবং তারপরে আবার মাউন্ট হবে।
ব্রিগেড

@ ক্র্যাব, স্লিমস্ক্রোল লাইনগুলি সরানোর চেষ্টা করুন; এটি এমন কিছু অদ্ভুত কিছু করতে পারে যা সমস্যার সৃষ্টি করে।
ব্রিগেন্ড

উত্তর:


92

আপনার বাকী কোডটি না দেখে এটি অনুমান। আপনি যখন সম্পাদক কনটেনার তৈরি করেন তখন উপাদানটির জন্য একটি অনন্য কী নির্দিষ্ট করুন:

<EditorContainer key="editor1"/>

যখন কোনও পুনরায় রেন্ডারিং হয়, একই কীটি দেখা গেলে, এটি পুনরায় ব্যবহারের পরিবর্তে পুনরায় প্রতিক্রিয়া দেখাবে এবং দৃশ্যের পুনর্গঠন করবে না। তারপরে ফোকাস করা আইটেমটির ফোকাস ধরে রাখা উচিত।


4
এটি একটি ইনপুট ফর্ম সমন্বিত উপ-উপাদান সরবরাহ করে আমার সমস্যা সমাধান করেছে। তবে আমার ক্ষেত্রে আমার বিপরীতে প্রয়োজন ছিল - ফর্মটি যখন চাইবে তখন তা পুনরায় রেন্ডারিং করা হয়নি। মূল বৈশিষ্ট্য যুক্ত করে কাজ করা হয়েছে।
স্যাম টেক্সাস


6
হতে পারে এমন উপাদান (গুলি) যাতে আপনার ইনপুট থাকে তাও পুনরায় রেন্ডার হয়। ঘেরযুক্ত উপাদানগুলির কীগুলি পরীক্ষা করুন।
পেটর গ্ল্যাডকিখ

@ পেটারগ্ল্যাডকিখ দ্বারা আপভোট মন্তব্য করুন। আমার সমস্ত ঘেরযুক্ত উপাদানগুলির চাবি প্রয়োজন।
ব্রায়ান ক্রেগুন

58

আমি এখানে বার বার ফিরে আসতে থাকি এবং সর্বদা আমার অন্য কোথাও সমাধানটি শেষে খুঁজে পাই find সুতরাং, আমি এটি এখানে নথি করব কারণ আমি জানি আমি এটি আবার ভুলে যাব!

inputআমার ক্ষেত্রে মনোযোগ হারিয়ে ফেলার কারণটি ছিল যে আমি inputরাষ্ট্রীয় পরিবর্তনকে আবার উপস্থাপন করছিলাম ।

বগি কোড:

import React from 'react';
import styled from 'styled-components';

class SuperAwesomeComp extends React.Component {
  state = {
    email: ''
  };
  updateEmail = e => {
    e.preventDefault();
    this.setState({ email: e.target.value });
  };
  render() {
    const Container = styled.div``;
    const Input = styled.input``;
    return (
      <Container>
        <Input
          type="text"
          placeholder="Gimme your email!"
          onChange={this.updateEmail}
          value={this.state.email}
        />
      </Container>
    )
  }
}

সুতরাং, সমস্যাটি হ'ল আমি সবসময় এক জায়গায় সব জায়গায় কোডিং শুরু করি তাড়াতাড়ি পরীক্ষা করার জন্য এবং পরে এগুলি পৃথক মডিউলগুলিতে বিভক্ত করে। তবে, এখানে এই কৌশলটি ব্যাকফায়ার করে কারণ ইনপুট পরিবর্তনতে রাষ্ট্র আপডেট করে ফাংশন রেন্ডার করে এবং ফোকাসটি হারিয়ে যায়।

ফিক্সটি সহজ, শুরু থেকেই মডুলারাইজেশন করুন, অন্য কথায়, " Inputউপাদানটিকে renderকার্যকারিতা থেকে সরিয়ে দিন"

স্থির কোড

import React from 'react';
import styled from 'styled-components';

const Container = styled.div``;
const Input = styled.input``;

class SuperAwesomeComp extends React.Component {
  state = {
    email: ''
  };
  updateEmail = e => {
    e.preventDefault();
    this.setState({ email: e.target.value });
  };
  render() {
    return (
      <Container>
        <Input
          type="text"
          placeholder="Gimme your email!"
          onChange={this.updateEmail}
          value={this.state.email}
        />
      </Container>
    )
  }
}

রেফারেন্স সমাধানে: https://github.com/styled-components/styled-components/issues/540#issuecomment-283664947


4
আমি রেন্ডার ফাংশনের ভিতরে একটি এইচওসি ব্যবহার করছিলাম, এইচওসি কলটিকে সংজ্ঞা সংজ্ঞাতে নিয়ে যাওয়া কৌতুকটি করেছিল। এই উত্তরের সাথে কিছুটা মিল similar
মার্ক ই ই

4
আমি মনে করি এটি আমার সমস্যা, তবে উপাদানগুলি বাইরে নিয়ে যেতে render()এবং class ... extends Componentরেফারেন্সের কারণে আমার সমস্যা হচ্ছে this। যেমনonChange={this.handleInputChange}
নাটিয়াস

4
গল্পের মনোবল, প্রতিক্রিয়া শ্রেণীর উপাদানগুলির জন্য, renderফাংশনের অভ্যন্তরের উপাদানগুলি সংজ্ঞায়িত করবেন না, কার্যকরী উপাদানগুলির জন্য প্রতিক্রিয়া দেখান, ফাংশন শরীরে উপাদানগুলি সংজ্ঞায়িত করবেন না।
ওং জিয়া হাউ

4
ধন্যবাদ! আপনি আমার বাট সংরক্ষণ করেছেন !!
কে-সাটো

4
@ নাজাতীয় আমার ঠিক একই অবস্থা ছিল। এই এইচওসি কলগুলি renderএই 'হ্যান্ডেল চ্যাঞ্জ' পদ্ধতিটি পাস করার ফাংশনের অভ্যন্তরে কল করেছিল এবং উপাদানগুলি ব্যবহার করার জন্য ফিরিয়ে দিয়েছে। যেমন const TextAreaDataField = TextAreaDataFieldFactory(this.handleChange)। আমি কেবল উপাদান উপাদানটি কনস্ট্রাক্টারে স্থানান্তরিত করেছি এবং renderপদ্ধতিতে সেগুলি অ্যাক্সেস করেছি this.TextAreaDataField। কবজির মতো কাজ করেছেন।
মার্কাস জুনিয়াস ব্রুটাস

36

যদি কোনও প্রতিক্রিয়া রাউটারের মধ্যে সমস্যা হয় তবে এর পরিবর্তে প্রপটি <Route/>ব্যবহার করুন ।rendercomponent

<Route path="/user" render={() => <UserPage/>} />


ফোকাসের ক্ষতি হ'ল কারণ componentপ্রপ ব্যবহার করেReact.createElement প্রতিটি পরিবর্তনগুলি কেবল পুনরায় রেন্ডারিংয়ের পরিবর্তে করে।

বিশদগুলি এখানে: https://reacttraining.com/react-router/web/api/Route/comp घटक


4
এটি মূলত আমার সমস্যা ছিল। বিশেষত, আমি ফোকাস-ক্ষতি ট্রিগার করে, উপাদান প্রপকে একটি বেনামে ফাংশনটি দিচ্ছিলাম:, <Route component={() => <MyComponent/>} />যখন আমার করা উচিত ছিল<Route component={MyComponent} />
ড্যানিয়েল

আপনি আমার দিন বাঁচিয়েছেন - হিসাবে সহজ!
ফ্যাব্রিকিও

12

আমার উত্তরটি @ z5h যা বলেছিল তার সাথে মিলে যায়।

আমার ক্ষেত্রে, আমি উপাদানটির জন্য Math.random()একটি অনন্য উত্পন্ন করতাম key

আমি ভেবেছিলাম key অ্যারের সমস্ত উপাদান পুনরায় রেন্ডারিংয়ের পরিবর্তে কেবলমাত্র সেই নির্দিষ্ট উপাদানটির জন্য একটি রেন্ডার ট্রিগার করতে ব্যবহৃত হয় (আমি আমার কোডের উপাদানগুলির একটি অ্যারে ফিরিয়ে দিই)। আমি জানতাম না যে এটি পুনরায় সরবরাহের পরে রাজ্য পুনরুদ্ধারের জন্য ব্যবহৃত হয়।

এটি সরানো আমার পক্ষে কাজ করেছে।


4
Npmjs.com/package/shortid এর মতো একটি মডিউলও এরকম কিছু হ্যান্ডল করার একটি দুর্দান্ত উপায়।
skwidbreth

5

উপাদানের সাথে autoFocusঅ্যাট্রিবিউট প্রয়োগ করা এমন inputপরিস্থিতিতে কর্মক্ষেত্র হিসাবে সম্পাদন করতে পারে যেখানে কেবলমাত্র একটি ইনপুট রয়েছে যেখানে ফোকাস করা দরকার। keyসেক্ষেত্রে একটি বৈশিষ্ট্য অপ্রয়োজনীয় হবে কারণ এটি কেবলমাত্র একটি উপাদান এবং তদ্ব্যতীত আপনাকে inputমূল উপাদানটির পুনরায় রেন্ডার উপর ফোকাস হারাতে এড়াতে উপাদানটিকে তার নিজস্ব উপাদানগুলিতে ভেঙে ফেলার চিন্তা করতে হবে না ।


এটি সর্বশেষ-রিসোর্টের কাজ হিসাবে চেষ্টা করতে হয়েছিল। আমি আনন্দিত এটি কাজ করে। স্পষ্টতই আমার অ্যাপটিতে একটি ত্রুটি রয়েছে অ্যাপটি পুনরায় রেন্ডার করে যখনই আমি পৃষ্ঠায় একমাত্র অনুসন্ধান ইনপুট টাইপ করার চেষ্টা করি। তবে autofocusইনপুট ক্ষেত্রে পৌঁছনো শুরু a 🙌
কেশবদুলাল

5

আমিও একই আচরণ পেয়েছি।

আমার কোডের সমস্যাটি ছিল আমি জেএসএক্স উপাদানগুলির মতো নেস্টেড অ্যারে তৈরি করেছি:

const example = [
            [
                <input value={'Test 1'}/>,
                <div>Test 2</div>,
                <div>Test 3</div>,
            ]
        ]

...

render = () => {
    return <div>{ example }</div>
}

এই নেস্টেড অ্যারের প্রতিটি উপাদান যখনই আমি প্যারেন্ট উপাদানটি আপডেট করি তখন তা পুনরায় রেন্ডার করে। এবং সুতরাং ইনপুটগুলি প্রতিবার "রেফ" প্রোপ হারাবে

আমি অভ্যন্তরীণ অ্যারেটিকে একটি বিক্রিয়া উপাদান (রেন্ডার ফাংশন সহ একটি ক্রিয়াকলাপ) এ রূপান্তরিত করে সমস্যার সমাধান করেছি

const example = [
            <myComponentArray />
        ]

 ...

render = () => {
    return <div>{ example }</div>
}

সম্পাদনা:

যখন আমি নেস্টেড তৈরি করি তখন একই সমস্যাটি উপস্থিত হয় React.Fragment

const SomeComponent = (props) => (
    <React.Fragment>
        <label ... />
        <input ... />
    </React.Fragment>
);

const ParentComponent = (props) => (
    <React.Fragment>
        <SomeComponent ... />
        <div />
    </React.Fragment>
);

3

আমি একই সমস্যাটি ইনপুট এবং তার মূল উপাদানগুলিকে মুখ্য মুছে ফেলার সমাধান করেছি

// Before
<input
    className='invoice_table-input invoice_table-input-sm'
    type='number'
    key={ Math.random }
    defaultValue={pageIndex + 1}
    onChange={e => {
        const page = e.target.value ? Number(e.target.value) - 1 : 0
        gotoPage(page)
    }}
/>
// After
<input
    className='invoice_table-input invoice_table-input-sm'
    type='number'
    defaultValue={pageIndex + 1}
    onChange={e => {
        const page = e.target.value ? Number(e.target.value) - 1 : 0
        gotoPage(page)
    }}
/>


2

আমি কেবল এই ইস্যুটি নিয়ে ছুটে এসেছি এবং সাহায্যের জন্য এখানে এসেছি। আপনার সিএসএস পরীক্ষা করে দেখুন! ইনপুট ফিল্ডটি থাকতে পারে user-select: none;বা এটি কোনও আইপ্যাডে কাজ করবে না।


2

আমার জন্য, অনুসন্ধান ইনপুট বাক্সটি একইভাবে রেন্ডার হওয়ার কারণে এটি ঘটছিল অনুসন্ধান ফলাফলগুলির তালিকা হিসাবে উপাদানটিতে (ইউজারলিস্ট বলা হয়) ঘটছিল। সুতরাং যখনই অনুসন্ধানের ফলাফলগুলি পরিবর্তন হয়েছে, ইনপুট বাক্স সহ পুরো ইউজারলিস্ট উপাদানটি পুনরায় রেন্ডার হয়েছে।

আমার সমাধানটি ছিল ইউজারলিস্টস অনুসন্ধান নামে একটি সম্পূর্ণ নতুন উপাদান তৈরি করা যা ব্যবহারকারী তালিকা থেকে পৃথক । এটি কাজ করার জন্য ইউজারলিস্টসर्चে ইনপুট ক্ষেত্রগুলিতে কীগুলি সেট করার দরকার নেই। আমার ইউজারস কনটেনারের রেন্ডার ফাংশনটি এখন এর মতো দেখাচ্ছে:

class UserContainer extends React.Component {
  render() {
    return (
      <div>
        <Route
          exact
          path={this.props.match.url}
          render={() => (
            <div>
              <UserListSearch
                handleSearchChange={this.handleSearchChange}
                searchTerm={this.state.searchTerm}
              />
              <UserList
                isLoading={this.state.isLoading}
                users={this.props.users}
                user={this.state.user}
                handleNewUserClick={this.handleNewUserClick}
              />
            </div>
          )}
        />
      </div>  
    )
  }
}

আশা করি এটিও কাউকে সহায়তা করবে।


2

যদি ইনপুট ক্ষেত্রটি অন্য কোনও উপাদানের ভিতরে থাকে (যেমন, একটি ধারক উপাদান যেমন <div key={"bart"}...><input key={"lisa"}...> ... </input></div>- উপবৃত্তগুলি এখানে বাদ দেওয়া কোডটি নির্দেশ করে), তবে ধারক উপাদানটিতে একটি অনন্য এবং ধ্রুবক কী থাকা আবশ্যক (পাশাপাশি ইনপুট ক্ষেত্রে) । অন্যথায়, সন্তানের রাষ্ট্রটি পুরানো ধারকটিকে কেবল পুনরায় রেন্ডারিংয়ের পরিবর্তে বাচ্চাদের অবস্থা আপডেট করা হলে প্রতিক্রিয়া একটি নতুন ব্র্যান্ডের উপাদান সরবরাহ করে। যৌক্তিকভাবে, কেবলমাত্র শিশু উপাদান আপডেট করা উচিত, তবে ...

ঠিকানার তথ্যগুলির একটি গুচ্ছ নিয়ে এমন একটি উপাদান লেখার চেষ্টা করার সময় আমার এই সমস্যা হয়েছিল। ওয়ার্কিং কোডটি এ জাতীয় দেখাচ্ছে

// import react, components
import React, { Component } from 'react'

// import various functions
import uuid from "uuid";

// import styles
import "../styles/signUp.css";

export default class Address extends Component {
  constructor(props) {
    super(props);
    this.state = {
      address1: "",
      address2: "",
      address1Key: uuid.v4(),
      address2Key: uuid.v4(),
      address1HolderKey: uuid.v4(),
      address2HolderKey: uuid.v4(),
      // omitting state information for additional address fields for brevity
    };
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange(event) {
    event.preventDefault();
    this.setState({ [`${event.target.id}`]: event.target.value })
  }

  render() {
    return (
      <fieldset>
        <div className="labelAndField" key={this.state.address1HolderKey} >
          <label className="labelStyle" for="address1">{"Address"}</label>
          <input className="inputStyle"
            id="address1"
            name="address1"
            type="text"
            label="address1"
            placeholder=""
            value={this.state.address1}
            onChange={this.handleChange}
            key={this.state.address1Key} ></input >
        </div> 
        <div className="labelAndField" key={this.state.address2HolderKey} >
          <label className="labelStyle" for="address2">{"Address (Cont.)"}</label>
          <input className="inputStyle"
            id="address2"
            name="address2"
            type="text"
            label="address2"
            placeholder=""
            key={this.state.address2Key} ></input >
        </div>
        {/* omitting rest of address fields for brevity */}
      </fieldset>
    )
  }
}

তীক্ষ্ণ চোখের পাঠকগণ নোট করবে যে <fieldset>এটি একটি উপাদানযুক্ত উপাদান, তবুও এটির জন্য কোনও চাবি লাগবে না। একই জন্য ঝুলিতে <>এবং <React.Fragment>বা এমনকি<div> কেন? হতে পারে কেবল তাত্ক্ষণিক পাত্রে একটি চাবি প্রয়োজন। আমি জানিনা. গণিত পাঠ্যপুস্তক যেমন বলেছে, ব্যাখ্যাটি অনুশীলন হিসাবে পাঠকের কাছে রেখে দেওয়া হয়েছে।


1

মূল কারণটি হ'ল: যখন রি-রেন্ডার প্রতিক্রিয়া জানায় তখন আপনার পূর্ববর্তী ডিওএম রেফটি অবৈধ। এর অর্থ হল প্রতিক্রিয়াটি ডোম গাছ পরিবর্তন করেছে এবং আপনি this.refs.input.focus কাজ করবে না, কারণ এখানে ইনপুটটি আর বিদ্যমান নেই।


1

সরবরাহ করা উত্তরগুলি আমাকে সাহায্য করে নি, আমি এখানে যা করেছি তা কিন্তু আমার একটি অনন্য পরিস্থিতি ছিল।

কোডটি সাফ করার জন্য আমি এই ফর্ম্যাটটি ব্যবহার করতে থাকি যতক্ষণ না আমি উপাদানটিকে অন্য কোনও ফাইলে টানতে প্রস্তুত।

render(){
   const MyInput = () => {
      return <input onChange={(e)=>this.setState({text: e.target.value}) />
   }
   return(
      <div>
         <MyInput />
      </div>
   )

তবে এটি যখন ফোকাস হারাতে বাধ্য করল, যখন আমি কোডটি সরাসরি কাজ করে ডিভের মধ্যে রাখি।

return(
   <div>
      <input onChange={(e)=>this.setState({text: e.target.value}) />
   </div>
)

আমি জানি না কেন এটি, এটি কেবল এটিই এইভাবে লেখার সাথে আমার সমস্যা ছিল এবং আমি আমার বেশিরভাগ ফাইলগুলিতে এটি করি তবে যদি কেউ অনুরূপ কিছু করে থাকে তবে এটি কেন মনোযোগ হারায়।


1

আমি valueপ্রপ স্যুইচ করেছি defaultValue। সেটা আমার জন্য কাজ করে.

...
// before
<input value={myVar} />

// after
<input defaultValue={myVar} />

1

এইচটিএমএল টেবিলের সাথে আমার একই সমস্যা ছিল যার মধ্যে একটি কলামে আমার ইনপুট পাঠ্য লাইন রয়েছে। একটি লুপের ভিতরে আমি একটি জেসন বস্তু পড়ি এবং আমি সারণি তৈরি করি বিশেষত আমার ইনপুটেক্সট সহ একটি কলাম থাকে।

http://reactkungfu.com/2015/09/react-js-loses-input-focus-on-typing/

আমি নিম্নলিখিত পদ্ধতিতে এটি সমাধান করতে পরিচালিত

import { InputTextComponent } from './InputTextComponent';
//import my  inputTextComponent 
...

var trElementList = (function (list, tableComponent) {

    var trList = [],
        trElement = undefined,
        trElementCreator = trElementCreator,
        employeeElement = undefined;



    // iterating through employee list and
    // creating row for each employee
    for (var x = 0; x < list.length; x++) {

        employeeElement = list[x];

        var trNomeImpatto = React.createElement('tr', null, <td rowSpan="4"><strong>{employeeElement['NomeTipologiaImpatto'].toUpperCase()}</strong></td>);
        trList.push(trNomeImpatto);

        trList.push(trElementCreator(employeeElement, 0, x));
        trList.push(trElementCreator(employeeElement, 1, x));
        trList.push(trElementCreator(employeeElement, 2, x));

    } // end of for  

    return trList; // returns row list

    function trElementCreator(obj, field, index) {
        var tdList = [],
            tdElement = undefined;

        //my input text
        var inputTextarea = <InputTextComponent
            idImpatto={obj['TipologiaImpattoId']}//index
            value={obj[columns[field].nota]}//initial value of the input I read from my json data source
            noteType={columns[field].nota}
            impattiComposite={tableComponent.state.impattiComposite}
            //updateImpactCompositeNote={tableComponent.updateImpactCompositeNote}
        />

        tdElement = React.createElement('td', { style: null }, inputTextarea);
        tdList.push(tdElement);


        var trComponent = createClass({

            render: function () {
                return React.createElement('tr', null, tdList);
            }
        });
        return React.createElement(trComponent);
    } // end of trElementCreator

});
...    
    //my tableComponent
    var tableComponent = createClass({
        // initial component states will be here
        // initialize values
        getInitialState: function () {
            return {
                impattiComposite: [],
                serviceId: window.sessionStorage.getItem('serviceId'),
                serviceName: window.sessionStorage.getItem('serviceName'),
                form_data: [],
                successCreation: null,
            };
        },

        //read a json data soure of the web api url
        componentDidMount: function () {
            this.serverRequest =
                $.ajax({
                    url: Url,
                    type: 'GET',
                    contentType: 'application/json',
                    data: JSON.stringify({ id: this.state.serviceId }),
                    cache: false,
                    success: function (response) {
                        this.setState({ impattiComposite: response.data });
                    }.bind(this),

                    error: function (xhr, resp, text) {
                        // show error to console
                        console.error('Error', xhr, resp, text)
                        alert(xhr, resp, text);
                    }
                });
        },

        render: function () {
    ...
    React.createElement('table', {style:null}, React.createElement('tbody', null,trElementList(this.state.impattiComposite, this),))
    ...
    }



            //my input text
            var inputTextarea = <InputTextComponent
                        idImpatto={obj['TipologiaImpattoId']}//index
                        value={obj[columns[field].nota]}//initial value of the input I read //from my json data source
                        noteType={columns[field].nota}
                        impattiComposite={tableComponent.state.impattiComposite}//impattiComposite  = my json data source

                    />//end my input text

                    tdElement = React.createElement('td', { style: null }, inputTextarea);
                    tdList.push(tdElement);//add a component

        //./InputTextComponent.js
        import React from 'react';

        export class InputTextComponent extends React.Component {
          constructor(props) {
            super(props);
            this.state = {
              idImpatto: props.idImpatto,
              value: props.value,
              noteType: props.noteType,
              _impattiComposite: props.impattiComposite,
            };
            this.updateNote = this.updateNote.bind(this);
          }

        //Update a inpute text with new value insert of the user

          updateNote(event) {
            this.setState({ value: event.target.value });//update a state of the local componet inputText
            var impattiComposite = this.state._impattiComposite;
            var index = this.state.idImpatto - 1;
            var impatto = impattiComposite[index];
            impatto[this.state.noteType] = event.target.value;
            this.setState({ _impattiComposite: impattiComposite });//update of the state of the father component (tableComponet)

          }

          render() {
            return (
              <input
                className="Form-input"
                type='text'
                value={this.state.value}
                onChange={this.updateNote}>
              </input>
            );
          }
        }

উত্তরগুলির জন্য দয়া করে ন্যূনতম কোডটি ব্যবহার করুন - এখানে আমাদের প্রচুর সম্পর্কযুক্ত কোড নেই।
ভাইটালি জেডনেভিচ

1

আমার সমস্যাটি ছিল যে আমি আইটেমটির একটি মান দিয়ে আমার কীটির নাম পরিবর্তনশীল রেখেছিলাম, আমার ক্ষেত্রে "নাম" তাই কীটি কী = = ${item.name}-${index}} was ছিল } সুতরাং যখন আমি আইটেম.নামের সাথে মান হিসাবে ইনপুটটি পরিবর্তন করতে চেয়েছিলাম তখন তাদের কীগুলিও পরিবর্তিত হবে এবং ফলস্বরূপ প্রতিক্রিয়াটি সেই উপাদানটিকে স্বীকৃতি দেবে না


0

দেখা যাচ্ছে আমি thisসেই উপাদানটির সাথে বাধ্যতামূলক ছিল যা এটি পুনরায় রেন্ডার করছিল।

আমি অনুভব করেছি যে অন্য কারও যদি সমস্যা হয় তবে আমি এটি এখানে পোস্ট করব।

আমাকে বদলাতে হয়েছিল

<Field
    label="Post Content"
    name="text"
    component={this.renderField.bind(this)}
/>

প্রতি

<Field
    label="Post Content"
    name="text"
    component={this.renderField}
/>

আমার ক্ষেত্রে যেহেতু সাধারণ ফিক্স, আমি আসলে না হলেই ভাল হত thisমধ্যে renderFieldকিন্তু আশা আমাকে আর এই ইচ্ছা সাহায্যের কেউ পোস্ট করছে।


0

আমার এই সমস্যাটি ছিল এবং সমস্যাটি পরিণত হয়েছিল যে আমি কোনও কার্যকরী উপাদান ব্যবহার করছি এবং পিতামাতার উপাদানগুলির রাষ্ট্রের সাথে সংযুক্ত করছি। আমি যদি কোনও শ্রেণীর উপাদান ব্যবহার করতে চলেছি, সমস্যাটি চলে গেল। আশা করি ফাংশনাল উপাদানগুলি ব্যবহার করার সময় এর চারপাশের কোনও উপায় রয়েছে কারণ এটি সহজ আইটেম রেন্ডারগুলি এবং আল এর জন্য অনেক বেশি সুবিধাজনক।


0

ট্যাগ ইনপুট পরবর্তী কোড অন্তর্ভুক্ত:

ref={(input) => {
     if (input) {
         input.focus();
     }
 }}

আগে:

<input
      defaultValue={email}
      className="form-control"
      type="email"
      id="email"
      name="email"
      placeholder={"mail@mail.com"}
      maxLength="15"
      onChange={(e) => validEmail(e.target.value)}
/>

পরে:

<input
     ref={(input) => {
          if (input) {
             input.focus();
          }
      }}
      defaultValue={email}
      className="form-control"
      type="email"
      id="email"
      name="email"
      placeholder={"mail@mail.com"}
      maxLength="15"
      onChange={(e) => validEmail(e.target.value)}
/>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.