質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

CSSフレームワーク

CSSフレームワークは、Webページのスタイルを指定する言語であるCSSを容易に構築するためのツールです。ツイッター社が開発した「Bootstrap」や段組レイアウトが可能な「Foundation」など様々なCSSフレームワークがあります。

Q&A

解決済

2回答

884閲覧

textarea 動かない

退会済みユーザー

退会済みユーザー

総合スコア0

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

CSSフレームワーク

CSSフレームワークは、Webページのスタイルを指定する言語であるCSSを容易に構築するためのツールです。ツイッター社が開発した「Bootstrap」や段組レイアウトが可能な「Foundation」など様々なCSSフレームワークがあります。

0グッド

2クリップ

投稿2020/09/09 06:48

編集2020/09/09 06:54

https://medium.com/@lucasalgus/creating-a-custom-auto-resize-textarea-component-for-your-react-web-application-6959c0ad68bc

上記のサイトを参考にして自動で高さが変わるtextareaを作りました。
①のコードのスタイルをstyled-componentsでスタイルするように②のコードに直しました。
しかしstyled-componentsに直したらtextareaに入力しても何も入力されず、、、
デベロッパーツールで見てみましたがエラーの表記も出ていませんでした。

どこが原因で動かないのかがわからないのでわかる人いましたら教えて欲しいです。
よろしくお願いします。

//①

import React, { FunctionComponent, useEffect, useRef, useState } from 'react'; import styled from 'styled-components'; const TextAreaA = styled.textarea` width: 100%; resize: none; ::-webkit-resizer { display: none; } `; export const TextArea: FunctionComponent = () => { const textAreaRef = useRef<HTMLTextAreaElement>(null); const [text, setText] = useState(''); const [textAreaHeight, setTextAreaHeight] = useState('auto'); const [parentHeight, setParentHeight] = useState('auto'); useEffect(() => { setParentHeight(`${textAreaRef.current!.scrollHeight}px`); setTextAreaHeight(`${textAreaRef.current!.scrollHeight}px`); }, [text]); const onChangeHandler = (event: React.ChangeEvent<HTMLTextAreaElement>) => { setTextAreaHeight('auto'); console.log(textAreaHeight); // console.log(parentHeight); setParentHeight(`${textAreaRef.current!.scrollHeight}px`); setText(event.target.value); // if (props.onChange) { // props.onChange(event); // } }; return ( <div style={{ paddingTop: '12px', paddingBottom: '12px', paddingLeft: '12px', paddingRight: '12px', maxHeight: '208px', minHeight: parentHeight, height: '28px', background: '#E1E6ED', }} > <TextAreaA // {...props} ref={textAreaRef} rows={1} style={{ height: textAreaHeight, }} onChange={onChangeHandler} /> </div> ); };

//②

import React, { FunctionComponent, useEffect, useRef, useState } from 'react'; import styled from 'styled-components'; type TArea = { parent: number; text: number; }; const TextAreaStyle = styled.div<TArea>` padding: 12px 12px; height: 28px; border-radius: 24px; max-height: 208px; min-height: ${({ parent }: TArea) => parent}px; textarea { width: 100%; resize: none; height: ${({ text }: TArea) => text}px; display: none; ::-webkit-resizer { display: none; } } `; export const TextArea: FunctionComponent = () => { const textAreaRef = useRef<HTMLTextAreaElement>(null); const [text, setText] = useState(''); const [textAreaHeight, setTextAreaHeight] = useState('auto'); const [parentHeight, setParentHeight] = useState('auto'); useEffect(() => { setParentHeight(`${textAreaRef.current!.scrollHeight}`); setTextAreaHeight(`${textAreaRef.current!.scrollHeight}`); }, [text]); const onChangeHandler = (event: React.ChangeEvent<HTMLTextAreaElement>) => { setTextAreaHeight('auto'); console.log(textAreaHeight); console.log(parentHeight); setParentHeight(`${textAreaRef.current!.scrollHeight}`); setText(event.target.value); // if (props.onChange) { // props.onChange(event); // } }; return ( <TextAreaStyle parent={Number(parentHeight)} text={Number(textAreaHeight)}> <textarea // {...props} ref={textAreaRef} rows={1} onChange={onChangeHandler} /> </TextAreaStyle> ); };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

もしかすると、以下の部分のdisplay: none;のせいではないですか?

TypeScript

1const TextAreaStyle = styled.div<TArea>` 2 padding: 12px 12px; 3 height: 28px; 4 border-radius: 24px; 5 max-height: 208px; 6 min-height: ${({ parent }: TArea) => parent}px; 7 textarea { 8 width: 100%; 9 resize: none; 10 height: ${({ text }: TArea) => text}px; 11 display: none; /* ←これ */ 12 ::-webkit-resizer { 13 display: none; 14 } 15 } 16`; 17

投稿2020/09/09 10:10

nskhei

総合スコア704

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。
以下の修正で、すべてが意図通り動くかどうかは分かりませんが、まずはtext<textarea> で囲むように修正してみるといかがでしょうか?

diff

1 <textarea 2 ref={textAreaRef} 3 rows={1} 4 onChange={onChangeHandler} 5- /> 6+ > 7+ {text} 8+ </textarea>

修正前だと、textがどのように変わっても、<textarea> の innerText は空のまま、つまり何も表示されないということになると思われます。

投稿2020/09/09 07:07

編集2020/09/09 07:20
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/09 07:46

回答ありがとうございます。修正しましたが変わりませんでした
jun68ykt

2020/09/09 08:17

コメントありがとうございます。 他に問題の原因になっていそうな箇所がみつかったら、また回答に追記するなどして、お知らせします。
退会済みユーザー

退会済みユーザー

2020/09/09 08:18

ご丁寧にありがとうございます!
jun68ykt

2020/09/09 10:39

上記の回答で、 > 修正前だと、textがどのように変わっても、<textarea> の innerText は空のまま、つまり何も表示されないということになると思われます。 と書いたのは、私の勘違いでした。申し訳ないです。 私のローカルでの検証だと、nskhei さんの回答にあるとおり textarea { width: 100%; resize: none; height: ${({ text }: TArea) => text}px; display: none; ::-webkit-resizer { display: none; } } に含まれる、 display: none; の行をとりあえず消去してみたら、textarea が表示されて、一応、それっぽく動きました。
退会済みユーザー

退会済みユーザー

2020/09/09 13:46

解決しました。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問