如何将处理程序函数用于两个不同的目的。 SPFX (React/TypeScript)
How to use a handler function for two different purposes. SPFX (React/TypeScript)
我正在创建 SPFX 表单 (react/Typescript)。
我正在使用处理函数:
public handleChange = (evt: any) => {
const {value} = (evt.target as any);
this.setState({
...this.state,
[evt.target.name]: value
});
}
处理多个文本字段。
我现在要做的是让这个处理程序满足字符数文本字段的要求。 (我知道我可以使用标签!)这些文本字段计算每个文本字段中输入了多少个字符。我不知道如何为此编写代码。
以下是我尝试过的:
处理函数:
public handleChange = (evt: any) => {
const {value} = (evt.target as any);
this.setState({
...this.state,
[evt.target.name]: value
}, () => {
let wordCount = this.state.SOMETHING.toString().length; //This is wrong!
this.setState({
...this.state,
[evt.target.name]: wordCount
});
});
}
但如您所见,我还不太了解该放些什么。正如您在 wordCount
变量中看到的那样,我正在计算文本字段状态的字符数量,但这显然行不通,因为我需要它来满足所有 运行 通过处理函数。您还可以看到我正在尝试使用 [evt.target.name]: wordCount
将其设置为状态,我认为这可能更接近于正确。但不确定。
如果有帮助,这里有 2 个文本字段,一个是用户输入文本字段,另一个(在它下面)是字符计数器:
<td><TextField
name="EssCrit1"
value={this.state.EssCrit1}
onChange={this.handleChange}
multiline rows={2}
/>
</td>
<td ><TextField
name="EssCritChars1"
value={this.state.EssCritChars1}
disabled={true}
/>
</td>
如您所见,字符计数器有它自己的状态,但如上所述,我如何获得处理函数来满足该状态以及用户输入文本字段的 onChange 事件?
任何帮助都会一如既往的好。
C
如果我没理解错的话,你可以像这样在你的 onChange 中添加一个带有相应计数器名称的附加参数:
<TextField
name="EssCrit1"
value={this.state.EssCrit1}
onChange={this.handleChange('EssCritChars1')} // curry the name of the counter like this
multiline rows={2}
/>
// We'll use counterName to update the correct counter state value
handleChange = (counterName: string) => (evt: any) => {
const {value} = (evt.target as any);
this.setState({
[evt.target.name]: value
}, () => {
let wordCount = this.state[evt.target.name].toString().length; // Access as an array to use dynamic keys
this.setState({
[counterName]: wordCount // now we have a separate counter variable
});
});
}
或者,您可以使用带有可选第二个参数的内联函数,如下所示:
// Text field that has a counter
<TextField
name="EssCrit1"
value={this.state.EssCrit1}
onChange={(e) => this.handleChange(e, 'EssCritChars1')} // Inline. Pass event and name of counter
multiline rows={2}
/>
// Text field that doesn't need a counter
<TextField
name="another_field"
value={this.state.another_field}
onChange={this.handleChange} // We only need the event so don't bother creating an inline function
multiline rows={2}
/>
// Second param is optional
handleChange = (evt: any, counter = '') => {
const {value} = (evt.target as any);
let newState = {
[evt.target.name]: value
}
if (counter) {
newState[counter] = value.toString().length
}
this.setState(prevState => ({...prevState, newState });
}
如果您想处理任何给定文本字段的值和值的长度:
public handleChange = (evt: any) => {
const {value} = (evt.target as any);
this.setState({
[evt.target.name]: value,
`${evt.target.name}Count`: value.toString.length,
});
}
我正在创建 SPFX 表单 (react/Typescript)。 我正在使用处理函数:
public handleChange = (evt: any) => {
const {value} = (evt.target as any);
this.setState({
...this.state,
[evt.target.name]: value
});
}
处理多个文本字段。
我现在要做的是让这个处理程序满足字符数文本字段的要求。 (我知道我可以使用标签!)这些文本字段计算每个文本字段中输入了多少个字符。我不知道如何为此编写代码。 以下是我尝试过的:
处理函数:
public handleChange = (evt: any) => {
const {value} = (evt.target as any);
this.setState({
...this.state,
[evt.target.name]: value
}, () => {
let wordCount = this.state.SOMETHING.toString().length; //This is wrong!
this.setState({
...this.state,
[evt.target.name]: wordCount
});
});
}
但如您所见,我还不太了解该放些什么。正如您在 wordCount
变量中看到的那样,我正在计算文本字段状态的字符数量,但这显然行不通,因为我需要它来满足所有 运行 通过处理函数。您还可以看到我正在尝试使用 [evt.target.name]: wordCount
将其设置为状态,我认为这可能更接近于正确。但不确定。
如果有帮助,这里有 2 个文本字段,一个是用户输入文本字段,另一个(在它下面)是字符计数器:
<td><TextField
name="EssCrit1"
value={this.state.EssCrit1}
onChange={this.handleChange}
multiline rows={2}
/>
</td>
<td ><TextField
name="EssCritChars1"
value={this.state.EssCritChars1}
disabled={true}
/>
</td>
如您所见,字符计数器有它自己的状态,但如上所述,我如何获得处理函数来满足该状态以及用户输入文本字段的 onChange 事件?
任何帮助都会一如既往的好。
C
如果我没理解错的话,你可以像这样在你的 onChange 中添加一个带有相应计数器名称的附加参数:
<TextField
name="EssCrit1"
value={this.state.EssCrit1}
onChange={this.handleChange('EssCritChars1')} // curry the name of the counter like this
multiline rows={2}
/>
// We'll use counterName to update the correct counter state value
handleChange = (counterName: string) => (evt: any) => {
const {value} = (evt.target as any);
this.setState({
[evt.target.name]: value
}, () => {
let wordCount = this.state[evt.target.name].toString().length; // Access as an array to use dynamic keys
this.setState({
[counterName]: wordCount // now we have a separate counter variable
});
});
}
或者,您可以使用带有可选第二个参数的内联函数,如下所示:
// Text field that has a counter
<TextField
name="EssCrit1"
value={this.state.EssCrit1}
onChange={(e) => this.handleChange(e, 'EssCritChars1')} // Inline. Pass event and name of counter
multiline rows={2}
/>
// Text field that doesn't need a counter
<TextField
name="another_field"
value={this.state.another_field}
onChange={this.handleChange} // We only need the event so don't bother creating an inline function
multiline rows={2}
/>
// Second param is optional
handleChange = (evt: any, counter = '') => {
const {value} = (evt.target as any);
let newState = {
[evt.target.name]: value
}
if (counter) {
newState[counter] = value.toString().length
}
this.setState(prevState => ({...prevState, newState });
}
如果您想处理任何给定文本字段的值和值的长度:
public handleChange = (evt: any) => {
const {value} = (evt.target as any);
this.setState({
[evt.target.name]: value,
`${evt.target.name}Count`: value.toString.length,
});
}